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 RAnd then read line by line:
"PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3)
should return
"PAHNAPLSIIGYIR"
.
Subscribe to see which companies asked this question
第五道题没看懂题意,先跳过去了,以后有空再做。
class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
result = []
if numRows == 1:
return s
SIZE = 2 * numRows - 2
for i in range(numRows):
if i == 0: #第一行,只输出竖着的一列第一个
j = 0
while True:
if j <len(s):
result.append(s[j])
j += SIZE
else:
break
elif i == numRows - 1: #最后一行,只输出竖着的一列最后一个
j = numRows - 1
while True:
if j <len(s):
result.append(s[j])
j += SIZE
else:
break
else: #其他,输出本列对应位置和斜着的对应部分
j1 = i
j2 = SIZE - i
while True:
flag = False
if j1 <len(s):
result.append(s[j1])
j1 += SIZE
flag = True
if j2 <len(s):
result.append(s[j2])
j2 += SIZE
flag = True
if not flag:
break
return ''.join(result)
这道题其实不难,静下心找到原来的数组下标和新的数组下标之间的变换关系,写出程序来基本就一遍通了。
记得判断一下numRows是否等于1,以防程序bug。