[题目]
字符串“PAYPALISHIRING”是在给定的行数上以之字形书写的(您可能想要以固定字体显示此模式,以提高可读性):
P A H N
A P L S I I G
Y I R
然后一行一行一行地读:“PAHNAPLSIIGYIR
”
编写一个字符串代码,在给定行数的情况下进行转换:
string convert(string s, int numRows);
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
Example 2:
Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
P I N
A L S I G
Y A H R
P I
[分析]
我们要把一个字符串按照给定的行数编码成锯齿状排列(也就是之字形)
首先我们定义一个二维数组来存放结果, 如果numRows是三, 二维数组初始值就是[[], [], []]
然后我们只需要遍历这个字符串往二维数组里面放字符即可
先从上往下放, 放到最后一个列表时转换方向,从下往上放, 放到第一个列表时再次转换方向, 从上往下放, 如此循环...
遍历结束后把二维数组按照内部数组的顺序输出字符串即可。
[代码实现]
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)]
i = 0
di = -1
for j in range(len(s))
if i == 0 or i == numRows - 1:
result[i].append(s[j])
di = -di \\到达第一个或最后一个列表时要转换前进方向
else:
result[i].append(s[j])
i += di
result1 = []
for l in result:
result1.extend(l)
return ''.join(result1)