z字型变换 python
时间: 2025-06-06 14:10:39 浏览: 19
### Python 实现 Z 字型变换
以下是基于提供的引用内容以及专业知识整理的 Python 实现 Z 字型变换的代码示例:
#### 方法一:通过标志位控制方向
这种方法利用了一个 `flag` 变量来控制字符分配的方向,当到达最顶端或底端时反转方向。
```python
def convert(s: str, numRows: int) -> str:
if numRows < 2: # 如果行数小于2,则无需转换
return s
res = [""] * numRows # 创建一个长度为numRows的列表用于存储每一行的结果
i, flag = 0, -1 # 初始化索引i和方向标志flag
for c in s: # 遍历输入字符串中的每一个字符
res[i] += c # 将当前字符添加到对应的行
if i == 0 or i == numRows - 1: # 当达到第一行或者最后一行时改变方向
flag = -flag
i += flag # 更新索引i,按照flag指示的方向移动
return "".join(res) # 合并所有行的结果并返回
```
此方法的核心在于使用变量 `flag` 来动态调整指针的上下移动逻辑[^3]。
---
#### 方法二:模拟 Z 字型路径
另一种方式是直接模拟 Z 字型的路径变化过程。该算法会根据当前所在的行号决定下一步应该前进还是后退。
```python
def convert(s: str, numRows: int) -> str:
if numRows == 1 or numRows >= len(s): # 特殊情况处理
return s
rows = [''] * numRows # 定义一个数组用来保存不同行的数据
current_row, step = 0, -1 # 设置初始状态参数current_row表示当前位置;step=-1意味着先向下走一步后再向上回溯
for char in s: # 对于字符串里的每个字母做如下操作
rows[current_row] += char # 把这个字母加到对应位置上去
if current_row == 0 or current_row == (numRows - 1): # 改变行走方向条件判断
step = -step
current_row += step # 调整下一个要访问的位置序号
result = ''.join(rows) # 连接所有的子串形成最终答案
return result
```
上述实现中引入了两个额外的状态变量——`current_row` 和 `step`,分别代表当前所处的行以及步长(正负决定了向上的还是向下的趋势)。每当触碰到边界之后就切换一次运动轨迹[^2]。
---
### 测试案例
为了验证以上两种方案的有效性,可以采用官方文档给出的例子来进行对比测试。
```python
if __name__ == "__main__":
test_cases = [
("PAYPALISHIRING", 3),
("PAYPALISHIRING", 4),
("A", 1)
]
results = []
for case in test_cases:
output_1 = convert(*case)
output_2 = convert_v2(*case) # 假设第二种方法命名为convert_v2
results.append((output_1, output_2))
print(results)
```
运行结果应分别为 `"PAHNAPLSIIGYIR"` 和 `"PINALSIGYAHRPI"` 等预期值[^4]。
---
阅读全文
相关推荐







