题目描述:
将一个给定字符串 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);
输入输出实例:
思路:对于题目中的描述,我们重点需要考虑的就是下一个字符放在哪里(第几行)的问题,我们要先定义一个n行的列表,要实现z字型,我们只需要在最开始一行和最后一行进行处理即可(如果题目只给的1行那我们直接返回s),如果现在放的字符在第零行,那我们下一个字符就要放在它下面的一行,如果当前放的字符在最后一行,那我们就需要改变放的方向,放在上面一行,遍历完s即可,最后返回我们用于存放更改之后字符串的列表。根据上述思路,我们可以得到如下代码:
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows==1:
return s
rows = [""]*numRows #n行的列表用来存储每行的字符
index = 0 #表示所在行
direction = 1 #用来判断字符走向,1为向下,-1为向上
for char in s:
rows[index] += char
#实现z型
if index==0:
direction = 1 #回到第0行就往下走
elif index == numRows-1:
direction = -1 #回到最后一行就往上
index = index + direction
return "".join(rows)