
Z 字形变换
题目描述: 将给定字符串按照指定行数进行 Z 字形排列,然后按行读取生成新字符串。
示例:
输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"
解法(模拟 + 找规律)
算法思路
观察 Z 字形排列的规律,可以发现数据是以 2 * numRows - 2 为一个周期进行循环的。以 numRows = 4 为例,下标变化如下:
0 6 12
1 5 7 11
2 4 8 10
3 9
第一行和最后一行的下标差值为固定周期 d = 2 * numRows - 2。中间的行则包含两个序列:一个是主周期序列,另一个是倒序填充的间隔序列。
具体逻辑分为三部分处理:
- 首行:从索引 0 开始,步长为
d。 - 中间行:对于第
k行,存在两个下标序列,分别是i和j,其中j = d - i。交替添加这两个位置的值。 - 末行:从索引
numRows - 1开始,步长为d。
C++ 代码实现
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1) return s;
string ret;
int d = 2 * numRows - 2, n = s.size();
// 1. 处理第一行
for (int i = 0; i < n; i += d) ret += s[i];
// 2. 处理中间的几行
for (int k = 1; k < numRows - ; k++) {
( i = k, j = d - k; i < n || j < n; i += d, j += d) {
(i < n) ret += s[i];
(j < n) ret += s[j];
}
}
( i = numRows - ; i < n; i += d) ret += s[i];
ret;
}
};




