41. Z 字形变换
题目链接:
题目描述:
将字符串 "PAYPALISHIRING" 以给定行数 numRows 写成 Z 字形后,按行读取生成新字符串。
题目示例:
输入:s = "PAYPALISHIRING", numRows = 3 输出:"PAHNAPLSIIGYIR"
算法原理(模拟):
思路:
找规律,用 row 代替行数。当 numRows = 4 时,字符排列呈现周期性变化。 不难发现,数据是以 2 * numRows - 2 为一个周期进行规律变换的。 第一行的数是:0, 2row - 2, 4row - 4; 第二行的数是:1, (2row - 2) - 1, (2row - 2) + 1, (4row - 4) - 1, (4row - 4) + 1; 以此类推,第一行、最后一行为差为 2row - 2 的等差数列;中间行除了第一个数取值为行数,每组下标围绕周期的倍数左右取值。 据此可写出迭代算法。
模拟解法代码(C++):
class Solution {
public:
string convert(string s, int numRows) {
string ret;
int d = 2 * numRows - 2, n = s.size();
if (numRows == 1) return s;
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;
}
};


