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);
convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”.
解题思路:
找各行的规律就可以了,第一行模4余0,第三行模4余2,剩余的在第2行。
代码:
class Solution {
public:
string convert(string s, int nRows) {
if(s.size() == 0 || nRows == 1)
return s;
char *result = new char[s.size()+1];
int step((s.size()-1)/(2*(nRows-1)));
int *mark = new int[step+2];
result[s.size()] = '\0';
int index = -1;
for(int i=0; i!=step+2; ++i) {
mark[i] = 2*(nRows-1)*i;
}
for(int i=0; i!=nRows; ++i) {
if(i == 0) {
for(int j=0; j!=step+1; ++j) {
result[++index] = s[mark[j]];
}
}
else if(i == nRows-1) {
for(int j=0; j!=step+1; ++j)
if(mark[j]+i < s.size()) {
result[++index] = s[mark[j]+i];
}
}
else {
for(int j=0; j!=step+1;++j) {
if(mark[j]+i <s.size()) {
result[++index] = s[mark[j]+i];
}
if(mark[j+1]-i<s.size()) {
result[++index] = s[mark[j+1]-i];
}
}
}
}
delete[] mark;
return result;
}
};