Z 字形变换
题目链接:
题目描述:

题目示例:

解法(模拟 + 找规律)
思路分析
这道题的核心在于找到行索引变化的周期规律。假设行数 numRows 为 4,字符排列成 Z 字形时,下标变化如下:
0 6 12
1 5 7 11
2 8
3 9
不难发现,数据是以 2 * numRows - 2 为一个周期进行循环的。我们可以把下标替换成用周期表示的变量:
- 第一行:下标是
0, 2*numRows-2, 4*numRows-4...,即差值为周期的等差数列。 - 最后一行:同理,也是差值为周期的等差数列。
- 中间行:除了首尾元素外,每组周期内有两个字符。例如第二行,下标围绕周期的倍数左右取值,分别是
(2n-1)和(2n)的位置。
基于这个规律,我们不需要真的构建一个二维数组来存储 Z 字形,而是直接通过数学计算确定每个字符应该归属哪一行,或者按行遍历字符串时直接跳过不需要的字符。
这里采用按行遍历的策略:先处理第一行,再处理中间的每一行,最后处理最后一行。对于中间行,每个周期需要取两个字符,分别对应正向和反向的下标。
代码实现
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. 处理第一行
( i = ; 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;
}
};









