首页 > 其他 > 详细

6.Z 字形变换

时间:2020-02-21 14:11:02      阅读:56      评论:0      收藏:0      [点我收藏+]

6.Z 字形变换

题目描述

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。

请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);

示例 1:
  • 输入: s = "LEETCODEISHIRING", numRows = 3
  • 输出: "LCIRETOESIIGEDHN"
示例 2:
  • 输入: s = "LEETCODEISHIRING", numRows = 4
  • 输出: "LDREOEIIECIHNTSG"
  • 解释:
L     D     R
E   O E   I I
E C   I H   N
T     S     G

题解

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
    我是根据Z行走动找出规律。根据索引判断他们在哪一行。
    技术分享图片
    如上图,循环节 cyc = numRows*2-2 在进行一定取余之后他们会有一定的规律。这个很容易发现。可以按照自己的思路来编程。
    但是要注意特殊情况。当行数是1的时候需要单独讨论。
python代码
class Solution:
    def convert(self, s: str, numRows: int) -> str:
        res = ['']*numRows
        cyc = numRows*2-2
        n = len(s)
        if numRows == 1: return s
        for i in range(n):
            index = i%cyc
            if index < numRows:
                res[index] += s[i]
            else:
                temp = numRows-2-index%numRows
                res[temp] += s[i]
        ans = ''
        for i in res:
            ans += i
        return ans
完整python代码
class Solution:
    def convert(self, s: str, numRows: int) -> str:
        res = ['']*numRows
        cyc = numRows*2-2
        n = len(s)
        if numRows == 1: return s
        for i in range(n):
            index = i%cyc
            if index < numRows:
                res[index] += s[i]
            else:
                temp = numRows-2-index%numRows
                res[temp] += s[i]
        ans = ''
        for i in res:
            ans += i
        return ans

def stringToString(input):
    return input[1:-1].decode('string_escape')

def main():
    import sys
    import io
    def readlines():
        for line in io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8'):
            yield line.strip('\n')

    lines = readlines()
    while True:
        try:
            line = next(lines)
            s = stringToString(line);
            line = next(lines)
            numRows = int(line);
            
            ret = Solution().convert(s, numRows)

            out = (ret);
            print(out)
        except StopIteration:
            break

if __name__ == '__main__':
    main()

6.Z 字形变换

原文:https://www.cnblogs.com/zhoufq/p/12340727.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!