思路:根据每个字符的下标来确定它在哪一行,然后生产新的字符串即可
代码如下:
class Solution {
public:
string convert(string s, int numRows) {
int size=s.length();
//行数取定义行数,如果字符串的长度小于行数的话则取字符串长度
numRows=min(numRows,size);
//如果字符串的长度为1或者行数为1时,直接输出原字符串
if(numRows==1||size==1) return s;
//m保存Z字重复一块有多少个字符,比如3行的话就有6个字符
int m=numRows*2-2;
//用来保存每行的字符
vector<vector<char>>res(numRows);
for(int i=0;i<size;i++){
//根据i来确定s[i]在哪一行,用numRows=3来举例,
//m=6
//i=4,j=4,s[i]就在res[2]中
int j=i%m;
if(j>=numRows){j=m-j;}
res[j].push_back(s[i]);
}
//输出字符串
string out;
for(int i=0;i<numRows;i++){
for(int j=0;j<res[i].size();j++){
out+=res[i][j];
}
}
return out;
}
};
思路二:按照思路走,
利用变量flag来指定往上走还是往下走
flag=1的意思往下走,当走到第一行的时候需要往下走
flag=-1的意思往上走,当走到最后一行的时候需要往上走
代码如下:
class Solution {
public:
string convert(string s, int numRows) {
int size=s.length();
//行数取定义行数,如果字符串的长度小于行数的话则取字符串长度
numRows=min(numRows,size);
//如果字符串的长度为1或者行数为1时,直接输出原字符串
if(numRows==1||size==1) return s;
//用来保存每行的字符串
vector<string>res(numRows);
//i来标记下标,flag来标记往下走还是往上走,初始为-1是从下往上改为从上往下走
int i=0,flag=-1;
for(char c:s){
res[i]+=c;
//当走到第一行或者最后一行需要进行变向
if(i==0||i==numRows-1) flag=-flag;
//每次走一步
i+=flag;
}
//输出字符串
string out;
for(int i=0;i<numRows;i++){
out+=res[i];
}
return out;
}
};