- 题目描述
将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:
P A H N
A P L S I I G
Y I R
之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"
实现一个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
- 示例
示例 1:
输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"
示例 2:
输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"
解释:
P I N
A L S I G
Y A H R
P I
- 解决方案
创建转换后的二维数组,依次遍历字符串中的每一个字符,按照Z字形变换的规则,把字符按列存放进数组中,放完之后,按照行优先的顺序,再把字符从二维数组中依次取出组合成字符串输出。
因为二维数组的创建方式本质上是创建了多个list,每个list对应一行,所以在遍历字符的同时设置标志位dire,控制字符往数组中放的时候,行的方向是从上往下还是从下往上。
另外需要注意如果行数为1的话,那么直接返回字符串本身,否则会报错。
- 代码
class Solution:
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
#先排除只有一行的情况
if numRows == 1:
return s
#定义一个numRows行的二维数组a,每一行都是一个list
a = [[] for i in range(numRows)]
#当前的行号
col = 0
#控制行前进的方向是向上还是向下
dire = 1
#遍历字符串中的每一个字符
for c in s:
a[col].append(c)
#如果走到了最后一行,就把行前进方向变为向上
if col == numRows -1:
dire = -1
#行前进方向为向下
elif col == 0:
dire = 1
col += dire
str = ""
for row in a:
for m in row:
str += m
return str