leetcode上的第6道题,
题目描述:
The string "PAYPALISHIRING" iswritten in a zigzag pattern on a given number of rows like this: (you may wantto 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"
Write the code that will take a string andmake this conversion given a number of rows:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3)should return "PAHNAPLSIIGYIR".
思路:根据转换’Z‘字型的行数nRows判断间隔step,其中首行和末行的字符以step取string text,
其余行按行数与step的关系来取值,(大家画个图,取个长长的z字型字符就好理解了)
解法:
class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
#思路:多花点时间写个长的‘z'分析了
if numRows == 1: return s
step = 2 * numRows - 2
len_s = len(s)
#first row
rets = s[::step] #这不就是切片做法么,[start:stop:step],[::]默认返回原数组
#except first and last row
for i in range(1, numRows - 1):
for j in range(i,len_s,step): #计算中间行的数
rets += s[j] #第i行一个完整列的数,按间隔取值
if (j + step - i * 2) < len_s: #第i行的列与列之间的数
rets += s[j + step - i * 2]
#last row
rets += s[(numRows -1)::step]
return rets