一、简介
在做Z字变换过程中,本人想到用数学思维去解释这道题,找列和行之间的规律,然后按照数学公式来进行计算,在做的过程中发现当数据变化后很可能造成结果不正确,在解题过程中发现了一个规律方法,且时间复杂度和空间复杂度都为O(N)。
引用:Z 字形变换(清晰图解)
二、题解
以上图为例,三行,[0]、[1]、[2]为行号,中1~9为字符串,希望输出159 2468 37。
从图中可以明显得出一个规律,顺序遍历数据过程中,索引都是[0],[1],[2],[1],[0],[1],[2]…。过程中在遍历到1、3、5、7、9都是反转折点。在几个点index都会顺序增和减,即[0],[1],[2] - [1],[0] - [1],[2] - [1],[0] - ,-标识反转位置。
三、实现流程
遍历字符串:
1、str[i] += c: 把每个字符 c 填入对应行
2、i += lag: 更新当前字符 c 对应的行索引
3、lag = - lag: 在达到Z字形转折点时,执行反向
代码:
# @lc code=start
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows < 2:
return s
# 制作列表
res = ["" for _ in range(numRows)]
i, flag = 0, -1
for c in s:
# 对应行索引插入数据
res[i] += c
if i == 0 or i == numRows - 1:
# 到达转折点进行反转
flag = -flag
i += flag
return "".join(res)
# @lc code=end
四、运行情况
Accepted
1157/1157 cases passed (52 ms)
Your runtime beats 88.21 % of python3 submissions
Your memory usage beats 49.16 % of python3 submissions (15.2 MB)