将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
- 从高赞的解题思路中学到很多(强推!!!):
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)
在遍历 s 中把每个字符填到正确的行 res[i]
算法流程: 按顺序遍历字符串 s:
https://leetcode-cn.com/problems/zigzag-conversion/solution/zzi-xing-bian-huan-by-jyd/
观看视频会有更进一步的了解
- 自己的思路(与官方解释中“按行访问”一样)
每行的字符之间都有一定的数学规律,但是这个代码很长很繁琐。。。。
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows == 1 or numRows >= len(s):
return s
a = numRows+numRows-1-1
ss = len(s)
if ss//a:
c = ss//a + 1
else:
c =1
z = ''
for i in range(numRows):
cc = 1
z += s[i]
if i==0:
while(cc <= c):
if (cc*a-i)<ss:
z += s[cc*a-i]
cc += 1
else:
if i==numRows-1:
k =1
j = i+k*a
while(j<ss):
z += s[j]
k+=1
j = i+k*a
else:
while(cc <= c):
if (cc*a-i)<ss:
z += s[cc*a-i]
if (cc*a+i) < ss:
z += s[cc*a+i]
cc += 1
return z