Description:
The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N
A P L S I I G
Y I R
And then read line by line: “PAHNAPLSIIGYIR”
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
For example:
convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”.
分析:好吧我用的是最朴素的做法:若有更好的方法欢迎指出~
记 t = (numRows - 1) * 2
1. 找规律发现第一行下标是以0为首项,t 为公差的等差数列,循环输出之
2. 第二行至倒数第二行分别是以 i 和 t - i (i 为行下标)为首项,t为公差的等差数列交错输出
3. 最后一行为以 t / 2 为首项, t为公差的等差数列,循环输出之
大功告成~
Submission Details:
1158 / 1158 test cases passed.
Status: Accepted
Runtime: 22 ms
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1) {
return s;
}
string res = s; //用于保存输出字符串
int p, q, r = 0; //p,q扫描s,r扫描res
int len = s.length();
int t = (numRows - 1) * 2; //重复出现周期
for (int i = 0; i < numRows; i++) {
if (i == 0) { //处理第一行
p = 0;
while (p < len) {
res[r++] = s[p];
p += t;
}
} else if (i != t / 2) { //处理除了最后一行的其他行
p = i;
q = t - i;
while (p < len && q < len) {
res[r++] = s[p];
res[r++] = s[q];
p += t;
q += t;
}
if (p < len) {
res[r++] = s[p];
}
} else { //处理最后一行
p = t / 2;
while (p < len) {
res[r++] = s[p];
p += t;
}
}
}
return res;
}
};