方法一:数组法
class Solution {
public:
string convert(string s, int numRows) {
if(s.length()==0||s.length()==1){//如果s的长度为0或1,直接返回其本身即可
return s;
}
vector<string>vec(numRows);//初始化容器,vec[i]代表第i行的字符串
bool upToDown=true;//判断是从上到下,还是从下到上
for(int i=0;i<s.length();){
if(upToDown){//从上到下
int j=0;//j主要是用来控制s中的各个字符放到vec中的哪一行
for(;j<numRows&&i+j<s.length();j++){
vec[j]+=s[i+j];//从第0行开始更新
}
i+=j;//更新下标,即跳到下一个还没处理的字符
upToDown=false;//从上到下更新完毕,下一次就要从下到上了,因此置为false
}else{//从下到上
int j=1;
for(;j<numRows-1&&i+j-1<s.length();j++){
vec[numRows-1-j]+=s[i+j-1];//从倒数第二行开始更新,因为从上到下更新时已经把最 后一行更新了
}
i+=j-1;//更新下标,即跳到下一个还没处理的字符
upToDown=true;//从下到上更新完毕,下一次就要从上到下了,因此置为true
}
}
string res;
for(int i=0;i<vec.size();i++){//遍历vec,将元素按行拷贝到字符串res
res+=vec[i];
}
return res;
}
};
//时间复杂度:O(n)
//空间复杂度:O(n)
04-20
996