Z 字形变换
题目描述

示例:

解题思路
这道题的核心在于找到字符排列的周期性规律。当行数 numRows 为 4 时,字符走向呈'之'字形。我们可以观察到,整个序列以 2 * numRows - 2 为一个完整周期进行循环。
具体来说:
- 第一行和最后一行的字符间隔固定为
2 * numRows - 2。 - 中间行的字符则分为两部分:一部分按周期递增,另一部分位于周期的对称位置。
基于这个规律,我们不需要真正构建二维矩阵,只需遍历字符串,根据当前字符所在的行号直接追加到结果中即可。这种模拟方法既节省空间又直观高效。
代码实现
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1) return s;
string ret;
int d = 2 * numRows - 2;
int n = s.size();
// 处理第一行
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) {
(i < n) ret += s[i];
(j < n) ret += s[j];
}
}
( i = numRows - ; i < n; i += d) ret += s[i];
ret;
}
};




