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

题目示例:

解法(模拟 + 找规律)
思路分析
这道题的核心在于找到字符排列的周期性规律。假设行数 numRows 为 4,我们可以画出 Z 字形的下标变化:
0 6 12
1 5 7 11
2 4 8 10
3 9
不难发现,数据是以 2 * numRows - 2 为一个周期进行循环的。对于每一行,我们需要确定该行在字符串中的索引位置。
- 第一行和最后一行:下标间隔固定为
2 * numRows - 2。 - 中间行:除了首尾元素外,每个周期内包含两个字符,分别位于当前周期的起始偏移量和结束偏移量处。
具体来看,第 k 行(非首尾)的两个下标分别为 i 和 j,其中 i 是主对角线上的点,j 是斜线回上的点。它们在一个周期内的相对位置是对称的。
C++ 代码实现
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();
// 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;
}
};





