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"
.
class Solution {
public:
string convert(string s, int r) {
if(r == 1) return s;
string res;
int n = s.size();
for(int i = 0; i < r; i++){
int start = i, interval1 , interval2;
int gap = 2 * r - 2;
if(i == 0 || i == r - 1) interval1 = interval2 = gap;
else{
interval1 = gap - 2 * i;
interval2 = gap - interval1;
}
int k = 0;
while(1){
int pos = start + interval1 * ((k + 1) / 2) + interval2 * (k / 2);
if( pos < n){
res.push_back(s[pos]);
k++;
}
else
break;
}
}
return res;
}
};
一种很聪明的解法
class Solution {
public:
string convert(string s, int numRows) {
vector<string> vs(numRows, "");
int n = s.length(), i = 0;
while (i < n) {
for (int j = 0; j < numRows && i < n; j++)
vs[j].push_back(s[i++]);
for (int j = numRows - 2; j >= 1 && i < n; j--)
vs[j].push_back(s[i++]);
}
string zigzag;
for (string v : vs) zigzag += v;
return zigzag;
}
};