目录
1.题目描述
将一个给定字符串 s
根据给定的行数 numRows
,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING"
行数为 3
时,排列如下:
P A H N A P L S I I G Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"
。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
2.题目分析
读这题的时候,巴拉巴拉一大堆什么进行z字排列,其实通俗点说就是:给定一个字符串,把字符串先从上往下一个一个排列很多行,这个行数等于numRows的大小,然后再往右上一个数占一行的放,直到第一排,然后重复这个过程。
所以我们的任务就是,把字符的索引关联上他所在的列,然后把每行所有的字符存在一个变量中,最后把变量链接起来即可
3.代码实现
class Solution:
def convert(self, s: str, numRows: int) -> str:
#如果numRows为1,或者numRows大于等于字符串s的长度,则无需转换,直接返回原字符串
if numRows == 1 or numRows >= len(s):
return s
# 初始化一个列表rows,用于存储每一行的字符,列表的长度为 min(numRows, len(s))
rows = [""] * min(numRows, len(s))
#定义cur_row 变量表示当前字符应该添加到哪一行
cur_row = 0
#定义going_down 变量用于跟踪是否正在向下移动(在 "Z" 字形的右侧)或向上移动(在 "Z" 字形的左侧)
going_down = False
#遍历字符串s中的每个字符
for char in s:
#将字符依次添加到当前行
rows[cur_row] += char
#如果当前行是第一行或最后一行,则切换移动方向
if cur_row == 0 or cur_row == numRows - 1:
going_down = not going_down
#根据移动方向增加或减少当前行索引
cur_row += 1 if going_down else -1
# 将每一行的字符连接起来,并返回结果字符串
return "".join(rows)
4.一丢丢吐槽
看这题的例子的时候感觉怎么都是n字形把,看了好几个视频才知道这题的例子要把脑袋向左旋转90°