Z 字形变换
这道题考察的是对字符串排列规律的理解。题目要求将字符串按照 Z 字形排列,然后按行读取。
解题思路
核心在于找到字符下标变化的周期规律。假设行数为 numRows,那么一个完整的 Z 字形周期长度为 2 * numRows - 2。
- 第一行和最后一行:字符间隔固定为
2 * numRows - 2。 - 中间行:每个周期内包含两个字符,分别位于当前周期的偏移量
k和d - k处(其中d为周期长度)。
需要注意的是,当 numRows 为 1 时,直接返回原字符串即可,无需变换。
代码实现
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();
// 处理第一行
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;
}
};


