6. 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"
.
题目链接:6. ZigZag Conversion
算法描述:
由题意知,给定一个字符串和行数,我们将对它进行 “zigzag” 方式的排序,排序完成后返回字符串。
我们可以发现 “zigzag” 排序方式就是将字符串按照 “V” 字形排列。 接下来我们寻找遍历它的规律。
我们用两个内嵌 for 循环,第一个 for 循环遍历其行,第二个 for 循环在每一行中对每个 “zigzag” 进行遍历(每个 “zigzag” 中要遍历两个字符)
每一个 “V” 即 “zigzag” ,我们将其编为一组,一组的长度为:size = 2 * numRows - 2。
每一个 “V” ,垂直向下的这一列中的元素与其它列对应的元素(行平行)之间间隔为一个 size。而斜向上的一列元素,在组中的位置为: size - i (i 为行数)。
设当前组的第一个字符所在位置为j - i,即 j - i 为每一组的起始字符位置,我们还需要找到倒数第 i 个,即 (j - i)+ (size - i) = j + size - 2 * i。
遍历时需要注意的是第一行和最后一行,遍历每组时只需要将头元素直接放入结果字符串即可。
代码:
class Solution {
public:
string convert(string s, int numRows) {
if(numRows==1)
return s;
string str="";
int size = 2 * numRows - 2;
for(int i=0; i<numRows; i++){
for(int j=i; j<s.size(); j+=size){
str += s[j];
if(i!=0 && i!=numRows-1 && j+size-2*i < s.length()){
str += s[j+size-2*i];
}
}
}
return str;
}
};