题目表述
思路分析
①首先,检查numRows是否小于,如果小于2,直接返回字符串s,即转换后的字符和原字符相同。
②初始化结果列表res,长度为numRows,列表中的每个元素都是一个空字符串,用来存储转换后的每一行的字符串。
这里用到了Python的列表推导式来简化代码,我也是第一次见到这种写法,学到了学到了。
res["" for _ in range(numRows):]
#对于range(numRows)生成的每一个元素,都生成一个新的空字符串""
③遍历原字符串s:
1):首先设置变量 i ,用来表示当前字符被添加到列表的哪一行。初试就是第一行,故 i = 0
2):按顺序遍历字符串 s 时,每个字符 c 在 N 字形中对应的行索引 先从 s1增大到sn,再行sn减小到s1,如此反复。因此再设置一个标签flag,用于判断遍历是否到达了Z字形的转折点,如果到了转折点时,接下来遍历到的字符将被反向添加到列表里。
④最后将列表res的结果连接起来即可。
【拓:在Python中,join() 方法是字符串(str)类的一个方法,用于将序列中的元素以指定的字符连接生成一个新的字符串。这个方法只适用于字符串类型的序列,比如列表(list)、元组(tuple)等,但其中的元素都必须是字符串类型。】
python
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)
后记
最近有种做题就是不断认证自己是个呆瓜的感觉
要么想不明白思路,要么写不准代码
这道题算很简单的,主要是理清过程
但是不看社区代码还是写不准,哭死