题目描述:
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 RAnd 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);
convert("PAYPALISHIRING", 3)
should
return "PAHNAPLSIIGYIR"
.解题思路:
根据zigzag pattern的规律,把每两列当做一个周期,一个周期包含的字符的个数为rows+rows-2。
对于一个周期的内的字符,除了第一行和最后一行包含一个字符以外,其他行都包含两个字符。
根据周期的长度和行号可以求出每一行的每一个字符在源字符串中的位置。
AC代码如下:
class Solution {
public:
string convert(string s, int numRows) {
string ans;
if (numRows == 1){
ans = s;
return ans;
}
int a = numRows * 2 - 2;
int n = s.size();
int j = 0;
while (j*a < n){
ans.push_back(s[j*a]);
j++;
}
for (int i = 1; i < numRows - 1; i++){
j = 0;
while (j*a + i < n){
ans.push_back(s[j*a + i]);
if (j*a + a - i < n){
ans.push_back(s[j*a + a - i]);
}
j++;
}
}
j = 0;
while (j*a + numRows - 1 < n){
ans.push_back(s[j*a + numRows - 1]);
j++;
}
return ans;
}
};