The string "PAYPALISHIRING"
is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N
A P L S I I G
Y I R
And then read line by line: "PAHNAPLSIIGYIR"
找规律即可,看一下大神的思路:
对于第i行,首先输出s[i],其次定义两个步长s1=2(n-1-i) s2=2i ,s1,s2在i基础上交替相加,如果没有重复并且没有越界,则输出相应字符。
例如第3行,i==2 首先输出s[i]==3 然后s1=2(n-1-2)=2(n-3) s2=2i=4 然后依次输出s[i+s1] s[i+s1+s2] s[i+s1+s2+s1]......每次输出时,都要判断s1,s2是否为零,为零说明上一个字符已经输出,其实由计算式可知,当i==0时,s2==0 当i==n-1时,s1==0,其余情况两者都均非零。在每一次输出字符时,都应判断该字符索引位置是否越界以及是否已经重复输出
临界条件判断:
当n==1时,直接返回s即可.
class Solution:
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
if numRows==1:
return s
result = ''
for i in range(numRows):
s1 = 2*(numRows-1-i)
s2 = 2*i
if i>=len(s):
break
result += s[i]
pos = i
while True:
pos += s1
if pos >=len(s):
break
if s1>0:
result += s[pos]
pos += s2
if pos>=len(s):
break
if s2>0:
result += s[pos]
return result