【Leetcode】Python实现Z字形变换

Z字形变换

题意解释:

比如有一个字符串 “0123456789ABCDEF”,转为zigzag

当 n = 2 时:

0 2 4 6 8 A C E

1 3 5 7 9 B D F

当 n = 4 时:

0     6      C

1   5 7   B  D

2 4   8 A    E

3     9      F

解题思路:

这道题就是看坐标的变化。并且需要分块处理。

n=2时,字符串坐标变成zigzag的走法就是:

 0   2   4   6

 1   3   5   7

n=3时的走法是:

 0        4       8

 1   3    5   7   9

 2        6       10 

我们发现,除了第一行和最后一行没有中间形成之字型的数字外,其他都有,而首位两行中相邻两个元素的index之差跟行数是相关的,为 2*nRows – 2, 根据这个特点,我们可以按顺序找到所有的黑色元素在元字符串的位置,将他们按顺序加到新字符串里面。对于红色元素出现的位置也是有规律的,每个红色元素的位置为 j + 2*nRows-2 – 2*i, 其中,j为前一个黑色元素的列数,i为当前行数。 比如当n = 4中的那个红色5,它的位置为 1 + 2*4-2 – 2*1 = 5,为原字符串的正确位置。当我们知道所有黑色元素和红色元素位置的正确算法,我们就可以一次性的把它们按顺序都加到新的字符串里面。

解法一:

class Solution(object):
    def convert(self, s, numRows):
        """ :type s: str :type numRows: int :rtype: str """
        str_length = len(s)
        ans = ""
        if numRows <= 1:
            return s
        for i in range(numRows):
            c1 = 2*numRows - 2*(i+1)
            c2 = 2 * i
            cnt = i

            ans += s[cnt]
            while cnt < str_length:
                if c1 != 0:
                    cnt += c1
                    if cnt < str_length:
                        ans += s[cnt]
                if c2 != 0:
                    cnt += c2
                    if cnt < str_length:
                        ans += s[cnt]

        return ans

解法二:

class Solution(object):
    def convert(self, s, numRows):
        """ :type s: str :type numRows: int :rtype: str """
        str_length = len(s)
                node_length = 2*numRows - 2  # 两列之间的差
                result = ""

                if str_length == 0 or numRows == 0 or numRows == 1:
                    return s

                for i in range(numRows):  # 从第一行遍历到最后一行
                    for j in range(i, str_length, node_length):
                        result += s[j]  # 第一行和最后一行 还有普通行的整列数字
                        if i != 0 and i != numRows-1 and j - 2*i + node_length < str_length:
                            result += s[j-2*i+node_length]  # 单列行的数字
                return result
    原文作者:Z字形编排问题
    原文地址: https://blog.csdn.net/chenhua1125/article/details/80412550
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞