题解
将一串字符按之字形排列成 n 行。
用一个数组 pos[ ] 记录每个字符排列后的位置。
对于首行和尾行,递增间隔是 2 * numRows - 2
;
中间行还要区分不同的列,第一列递增间隔是 2 * (numRows - row - 1)
,第二列是 2 * row
,其中,row
表示当前处理的行。
往后的列按此轮流交替。
class Solution {
public:
string convert(string s, int numRows) {
if(numRows == 1) return s;
int n = s.length();
vector<int> pos(n);
int k = 0;
for(int row = 0; row < numRows; ++row){
int i = row;
if(row == 0 || row == numRows - 1){
while(i < n){
pos[k++] = i;
i += 2 * numRows - 2;
}
}
else{
bool flag = 1;
while(i < n){
pos[k++] = i;
if(flag) i += 2 * (numRows - row - 1);
else i += 2 * row;
flag = !flag;
}
}
}
string ans;
for(int i = 0; i < n; ++i) ans.push_back(s[pos[i]]);
return ans;
}
};