Z 字形变换
Zigzag Conversion
本机进度仅保存在当前浏览器
题目描述
将一个给定字符串 s 根据给定的行数 numRows,以从上往下、从左到右进行 Z 字形排列,然后按行连接输出。
示例:s = "PAYPALISHIRING",numRows = 3,Z 形排列后按行读出 "PAHNAPLSIIGYIR"。
解题思路
- Z 形排列按列分组周期为 2 numRows - 2:第一列竖直向下 numRows 个字符,斜线部分 numRows - 2 个。
- 按周期规律分配下标即可模拟:用行指针上下弹跳,方向在触顶或触底时翻转。
- 两行与一行的边界情况要单独处理(周期退化为 1 或 2,弹跳逻辑需防除零)。
参考实现
查看参考实现Python · 建议先自行作答
def convert(s, numRows):
if numRows == 1:
return s
rows = [''] * numRows
r, step = 0, 1 # step 控制行指针弹跳方向
for ch in s:
rows[r] += ch
if r == 0:
step = 1
elif r == numRows - 1:
step = -1
r += step
return ''.join(rows)