6. ZigZag Conversion
把字符串摆成一个之字型,然后从前到后读取
思路:
除了第一行和最后一行没有中间形成之字型的数字外,其他都有,而首位两行中相邻两个元素的index之差跟行数是相关的,为 2*nRows - 2, 根据这个特点,我们可以按顺序找到所有的黑色元素在元字符串的位置,将他们按顺序加到新字符串里面。对于红色元素出现的位置也是有规律的,每个红色元素的位置为 j + 2*nRows-2 - 2*i, 其中,j为前一个黑色元素的列数,i为当前行数。
class Solution {
public:
string convert(string s, int numRows) {
if (numRows <= 1) return s;
int size = 2 * numRows - 2;
string res = "";
for (int i = 0; i < numRows; ++i){
//每一行起始指标为i
for (int j = i; j < s.size(); j += size) {
res += s[j];
int tmp = j + size - 2 * i;
//判断不是第一行或者最后一行,并且在一定范围内
if (i != 0 && i != numRows - 1 && tmp < s.size())
res += s[tmp];
}
}
return res;
}
};