题目来源
解题方法
电梯法
从上到下,从下到上进行字符串的填充,我们可以用一个变量curRow来表示当前行,用一个变量goDown来表示是否往下走,当curRow为0或者numRows-1的时候,说明应该改变方向了,那么就将goDown取非,curRow改变为相对应的行
class Solution {
public:
string convert(string s, int numRows) {
if(numRows == 1)
return s;
int n=s.size();
vector<string> vector(min(n,numRows));
bool godown=false;
int curRow=0;
for(int i=0;i<n;i++){
vector[curRow]+=s[i];
if(curRow==0 || curRow==numRows-1)
godown=!godown;
curRow+=godown?1:-1;
}
string res;
for(string str : vector)
res+=str;
return res;
}
};
逐行访问
按照Z字形,对每一行进行逐行访问,第一行和最后一行的字符相差2numRows-2,其余行的字符k(2numRows−2)+i 以及 (k+1)(2*numRows-2)- i 处
class Solution {
public:
string convert(string s, int numRows) {
int n = s.size();
if(numRows == 1 || numRows > n)
return s;
string res;
int len=2*numRows-2;
for(int i=0;i<numRows;i++){
for(int j=0;j+i<n;j+=len){
res+=s[i+j];
if(i!=0 && i!=numRows-1 && j+len-i<n)
res+=s[j+len-i];
}
}
return res;
}
};