LC 6字符串中等第 45 / 95 题

Z 字形变换

Zigzag Conversion

模拟规律
本机进度仅保存在当前浏览器

题目描述

将一个给定字符串 s 根据给定的行数 numRows,以从上往下、从左到右进行 Z 字形排列,然后按行连接输出。

示例:s = "PAYPALISHIRING",numRows = 3,Z 形排列后按行读出 "PAHNAPLSIIGYIR"。

解题思路

  1. Z 形排列按列分组周期为 2 numRows - 2:第一列竖直向下 numRows 个字符,斜线部分 numRows - 2 个。
  2. 按周期规律分配下标即可模拟:用行指针上下弹跳,方向在触顶或触底时翻转。
  3. 两行与一行的边界情况要单独处理(周期退化为 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)

复杂度与归属

时间复杂度O(n)
空间复杂度O(n)
所属分类字符串
题源LeetCode 6

关联教程

返回题图鉴