解析:
对于四行的实例,它的字符数分布是这样的:
解析参考了官方求解,从左向右遍历字符,将它放到对应的行中,只有在第一行或者最后一行,迭代的方向才会发生改变.
solution:
①将每个字符顺次放到对应的位置
class Solution {
public:
string convert(string s, int numRows) {
if(numRows == 1) return s;
int col = 0;
vector<string> vec(min(numRows,(int)s.size()));
int flag = 0;
for(char cc:s)
{
vec[col]+=cc;
if(col == 0 || col == numRows-1) flag = !flag;//很巧妙地将方向变化
col +=flag?1:-1;
}
string st;
for(string str:vec) st+=str;//这里值得学习
return st;
}
};
②根据每个字符下标的规律,找到它对应的位置
第一行和最后一行每两个元素之间的间隔为step=2*(numRows-1);
其他行的元素之间间隔为step2i(行)和2*i交替
class Solution {
public:
string convert(string s, int numRows) {
if(numRows == 1) return s;
int step = 2*(numRows-1);
int n = s.size();
vector<string> vec(numRows);
for(int i = 0;i<numRows;i++)
{
int j=i;
int add = 2*i;
while(j<n)
{
vec[i]+=s[j];
add = step-add;//这里很巧妙,间隔交替而且可以用一个循环判断
if(i==0||i==numRows-1)
j=j+step;
else
j = j+add;
}
}
string str;
for(string st:vec)
str=str+st;
return str;
}
};片