ZigZag Conversion
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".tag: string
9/24/2015 update
Another approach, view the zigzag graph as separated groups.
0-5 belongs to group 1, 6-11 belongs to group 2, etc…
0 6 12 1 5 7 11 13 2 4 8 10 14 3 9 15 *--* *----* *--- (1) (2) (3)---
assume there are n rows, gap between the same location element in adjacent groups is 2 * (n – 1)
class Solution {
public:
string convert(string s, int numRows) {
string ans;
if(numRows == 0) return "";
if(numRows == 1) return s;
int gap = 2 * (numRows - 1);
for(int i = 0; i < numRows; i++){
if(i == 0){
//first line
int j = 0;
while(j < s.size()){
ans.push_back(s[j]);
j += gap;
}
}
else if(i == numRows - 1){
//last line
int j = i;
while(j < s.size()){
ans.push_back(s[j]);
j += gap;
}
}
else{
//in the middle lines
int j1 = i;
int j2 = 2 * (numRows - 1) - j1;
while(j2 < s.size()){
ans.push_back(s[j1]);
ans.push_back(s[j2]);
j1 += gap;
j2 += gap;
}
if(j1 < s.size()){
ans.push_back(s[j1]);
}
}
}
return ans;
}
};
觉得是个数学题。我的思路是按zigzag图形的每行进行扫描,找规律计算出每个点对应的string的索引值,将该字符压入re中。
网上的关于zigzag的解释不多,大都是讲另一个zigzag螺旋矩阵。本题指的是并列排列的N字形矩阵。
他有点像: | / | / | / | / |
我们取每个N的左边一竖和中间的斜线作为循环单位“| /”,利用offset进行单位间的偏移。
需要注意的是,我们要把nRow=1的情况单独考虑,否则会导致offset为0,死循环,而内存超界。
class Solution {
public:
string convert(string s, int nRows) {
string re;
if(nRows == 1){
return s;
}
for(int i = 0; i < nRows; i++){//for each row
int offset = 0;//for each unit
while(true){
int index = offset + i;
if(index >= s.size()){
break;
}
re.push_back(s[index]);
if(i == 0 || i == nRows - 1){
offset += (nRows - 1) * 2;
continue;
}
index = offset + i + (nRows - i - 1) * 2;
if(index >= s.size()){
break;
}
re.push_back(s[index]);
offset += (nRows - 1) * 2;
}
}
return re;
}
};
