题目
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例
输入:s = “PAYPALISHIRING”, numRows = 3
输出:“PAHNAPLSIIGYIR”
输入:s = “A”, numRows = 1
输出:“A”
解法一
利用二维矩阵模拟,两种情况:向下走和向右上走。
解法二
找规律直接构造,指定行数为r,一个周期为2r-2,则可以用余数得知是在周期的哪一个位置,即哪一行。如果是第一行或者最后一行,一个周期内只有一个数,如果其他的,有两种。
class Solution:
def convert(self, s: str, numRows: int) -> str:
r=numRows
n=len(s)
if n <= r or r==1:
return s
t=2*r-2
ans=[]
for i in range(r): #遍历每一行
for j in range(0,n-i,t):
ans.append(s[i+j])
if 0<i<r-1 and j+t-i<n:
ans.append(s[j+t-i])
return "".join(ans)