Z 字形变换
题目描述
将字符串按照 Z 字形排列在给定行数的网格中,然后按行读取生成新字符串。

解题思路
这道题的核心在于找到字符移动的周期性规律。假设行数为 numRows,我们可以观察到数据是以 2 * numRows - 2 为一个周期进行循环的。
以 4 行为例,下标变化如下:
- 第一行:0, 6, 12...
- 第二行:1, 5, 7, 11...
- 第三行:2, 4, 8, 10...
- 第四行:3, 9...
对于中间的行(非首尾),每个周期内会有两个字符属于该行;而首尾行每个周期只有一个字符。利用这个特性,我们可以通过模拟遍历的方式直接拼接结果。
C++ 代码实现
class Solution {
public:
string convert(string s, int numRows) {
string ret;
int d = 2 * numRows - 2, n = s.size();
// 特殊情况处理
if (numRows == 1) return s;
// 处理第一行
for (int i = 0; i < n; i += d) ret += s[i];
// 处理中间行
for (int k = 1; k < numRows - 1; k++) {
for (int i = k, j = d - k; i < n || j < n; i += d, j += d) {
if (i < n) ret += s[i];
if (j < n) ret += s[j];
}
}
// 处理最后一行
for ( i = numRows - ; i < n; i += d) ret += s[i];
ret;
}
};




