LeetCode 6 ZigZag Conversion

一、题目链接

https://leetcode.com/problems/zigzag-conversion/

二、解答

这题有多个解答,我只取一种比较直观的,而且我认为,这种解法是最适合计算机的,其他如找出数学规律的解答,其数学思想是好的,但是,我认为利用直观的解法可以节约我们的时间。

先给出代码

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows < 2:
            return s
        row_strs = []
        for i in range(numRows):
            row_strs.append('')
        row = 0
        flag = -1
        for i in range(len(s)):
            row_strs[row] += s[i]
            if row == 0 or row == numRows - 1:
                flag = -flag
            row += flag
        ans = ''
        for each in row_strs:
            ans += each
        return ans

本题的解法思路很明显,我们把每一行当成一个子串单独拎出来,然后,根据 ZigZag 的规律直接一个一个往各层的子串中添加字符即可。顺着那个 ZigZag 的轨迹来,可以说是比较直观的。这里比较机智的一个点是使用 flag 标志来控制拉链形的轨迹。

时间复杂度:$O(N)$。 空间复杂度:$O(N)$

三、完整代码

# -*- coding: utf-8 -*-
# @File  : leet_06.py
# @Author: FanyFull
# @Date  : 2021/7/11

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows < 2:
            return s
        row_strs = []
        for i in range(numRows):
            row_strs.append('')
        row = 0
        flag = -1
        for i in range(len(s)):
            row_strs[row] += s[i]
            if row == 0 or row == numRows - 1:
                flag = -flag
            row += flag
        ans = ''
        for each in row_strs:
            ans += each
        return ans

if __name__ == '__main__':
    solution = Solution()
    s = 'AB'
    numRows = 1
    ans = solution.convert(s, numRows)
    print(ans)

LeetCode 6 ZigZag Conversion
http://fanyfull.github.io/2021/07/11/LeetCode-6-ZigZag-Conversion/
作者
Fany Full
发布于
2021年7月11日
许可协议