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

题目示例:

解题思路
这道题的核心在于找规律。假设行数 numRows 为 4,字符排列成 N 字形时,下标变化呈现周期性。
观察发现,数据是以 2 * numRows - 2 为一个周期进行循环的。我们可以将下标映射到这个周期内:
- 第一行的数是:0, 2row - 2, 4row - 4...
- 第二行的数是:1, (2row - 2) - 1, (2row - 2) + 1...
- 中间行除了首尾外,每组下标围绕周期的倍数左右取值。
- 最后一行的数则是等差数列。
基于这个规律,我们可以分三部分处理:第一行、中间行、最后一行。这样就能避免复杂的二维数组模拟,直接通过数学计算拼接字符串。
代码实现
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;
}
};





