leetcode p6: ZigZag_Conversion
给定一个字符串s和行数numRows, 先将该字符串按z形排成numRows行,然后按行输出所有字符组成的新字符串。
举个栗子:
从中发现:
- 这些数字都与6有关,称为magicNum,该数与行数有关,举个不同行的例子,可以发现规律:
magicNum = 2*(numRows - 1)
; - 对于每行的第一个数字,是以2为步长依次递减的,当为0时,重新赋值为magicNum;
- 对同一行,已知一个步长,它的下一步步长为magicNum减去当前步长。
c++ 代码如下
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1)
return s;
string res = "";
int magicNum = 2*(numRows - 1);
for (int row = 0; row < numRows; ++row) {
int initRowStep = magicNum - row*2; // 每行的起始步长
if (initRowStep == 0) { // 步长为0,重置为magicNum
initRowStep = magicNum;
}
int step = initRowStep;
for (int idx = row; idx < s.size(); ) {
res += s[idx];
idx += step;
step = magicNum - step;
if (step == 0) {
step = magicNum;
}
}
}
return res;
}
};