class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows == 1: #当层数为1的时候就直接输出原来的序列即可
return s
res=list() #存储所有行的 字符串输出
for i in range(numRows):
res.append("")
dir=1; #表示行数正向,-1 表示行数反向
i=0
tmpStep=1
while(i<len(s)):
if tmpStep <= numRows and dir == 1: #正向
res[tmpStep-1] += s[i]
tmpStep += 1 #正向往下加一层
if tmpStep == numRows+1: #转换方向点
dir = -1
tmpStep = numRows - 1
elif tmpStep >= 1 and dir == -1:
res[tmpStep-1] += s[i]
tmpStep -= 1 #向上一层
if tmpStep == 0: # 转换方向点
dir = 1
tmpStep = 2
i += 1 #字符串当前下标前进一位
result=""
for str in res:
result += str
return result
思路:
原始序列是一个字符串
把它想象为一条线
题目的要求就是:把这条线拉成一个NNNNNN的形状,
一个重要的点:在拉这条线的时候,线内部的结构是没有变的
原序列是如下图的①,弯曲之后形变为②,就是在序列②的开始部分用一个小球先下楼,再上楼,再下楼,再上楼,依此往复
题目中的numRows理解为层数,程序中使用dir记录是在上楼还是再下楼。
至于每一层的字符的存储问题。则可以使用list列表中存储楼层数的str,用于存储每一层先后进入的字符
最后从第一层到最后一层将这些字符串连接起来就可以得到最终的序列了