题目描述:
将一个给定字符串 s
根据给定的行数 numRows
,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING"
行数为 3
时,排列如下:
P A H N A P L S I I G Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"
。
示例 1:
输入:s = "PAYPALISHIRING", numRows = 3 输出:"PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4 输出:"PINALSIGYAHRPI" 解释: P I N A L S I G Y A H R P I
示例 3:
输入:s = "A", numRows = 1 输出:"A"
解题思路:
我自己一开始思考的解题方法过于冗杂了,看了大佬的解题思路不禁拍案叫绝。
传入参数s是一个字符串,numRows表示z字排列的行数。字符串s从上往下、从左到右进行z字形排列的过程,可以将其按行依次写入子串,最后读取的时候只需要拼接子串就行了。
可以观察到,z字排列的时候,行号变化过程为:0,1,……,numRows-1,随后再从numRows-1反向变化到0:numRows-1,numRows-2,……,1,0。从正向到反向,再从反向到正向,在代码中可以用一个变量flag控制此变换。
于是可以构造一个含有numRows个子串的列表res_list,将s中的字符按顺序依次写入res_list[0]、res_list[1]、……、res_list[numRows-1]、res_list[numRows-2]、……、res_list[1]、res_list[0]、……
最后依次拼接res_list中的所有子串。
扫描二维码关注公众号,回复:
17282568 查看本文章
代码:
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows<2:
return s
res_list = ['' for _ in range(numRows)]
i,flag = 0,-1
for c in s:
if i==0 or i == (numRows-1):
flag *= -1
res_list[i] += c
i += flag
return ''.join(res_list)