41. Z 字形变换
题目描述:
将字符串 s 给定行数 numRows,按 Z 字形排列后,再按行读取生成新字符串。

题目示例:

解法(模拟 + 找规律)
思路分析
这道题的核心在于找到下标变化的周期性规律。当 numRows = 4 时,字符排列如下:
0 6 12
1 5 7 11
2 4 8 10
3 9
不难发现,数据是以 2 * numRows - 2 为一个周期进行循环的。我们可以把下标替换成用周期表示的变量:
- 第一行:下标为
0, 2*numRows-2, 4*numRows-4...,即差值为周期的等差数列。 - 最后一行:同理,也是差值为周期的等差数列。
- 中间行:除了首尾元素外,每组包含两个数,它们围绕周期的倍数左右对称分布。例如第二行,下标为
k和(2*numRows-2) - k。
基于这个规律,我们不需要真正构建二维数组,只需遍历三组情况:第一行、中间行、最后一行,依次拼接字符即可。
代码实现
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];
( k = ; 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;
}
};





