41. Z 字形变换
题目链接:
题目描述: 将给定字符串根据指定行数进行 Z 字形排列,然后按行读取生成新字符串。
解法(模拟 + 找规律)
思路分析
观察 N 字形排列,可以发现下标变化具有周期性。当行数为 numRows 时,周期长度为 2 * numRows - 2。
第一行和最后一行的字符间隔固定为周期长度。中间行的字符则分为两部分:一部分向下移动,另一部分向上移动,两者间隔互补。
具体策略如下:
- 单独处理第一行和最后一行。
- 中间行需要同时考虑向下和向上的索引位置。
实现代码
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1) return s;
string ret;
int d = 2 * numRows - 2, 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) {
if (i < n) ret += s[i];
if (j < n) ret += s[j];
}
}
// 处理最后一行
for (int i = numRows - 1; i < n; i += d) ret += s[i];
return ret;
}
};


