第一种办法,简单粗暴的排着算,要求几行就设几个vector,然后就按照规则行数先加后减,依次加到vector里:
class Solution {
public:
string convert(string s, int numRows) {
vector<char> a[numRows];
string str;
int n=s.size();
int l=0;
int flag;
for(int i=0;i<n;i++)
{
if(l==0)
{
flag=0;
}
if(l==numRows-1)
{
flag=1;
}
a[l].push_back(s[i]);
if(flag==0&&l+1<numRows)
{
l+=1;
}
if(flag==1&&l-1>=0)
{
l-=1;
}
}
for(int j=0;j<numRows;j++)
{
int n1=a[j].size();
for(int k=0;k<n1;k++)
{
str+=a[j][k];
}
}
return str;
}
};
第二种,算一下,具体每行的每个位置的坐标情况,形状像正弦曲线,第一行最后一行间距是均匀的8(4*(5-1)),第二行是6(8-2*1),2(2*1),第三行是4(8-2*2),4(2*2),按照这个规律编码即可。
0 8 16
1 7 9 15
2 6 10 14
3 5 11 13
4 12
class Solution {
public:
string convert(string s, int numRows) {
string re;
int n=s.size();
if(numRows==1||n==1)
{
re=s;
}
else
{
for(int i=0;i<numRows;i++)
{
int b=i;
if(i==0||i==(numRows-1))
{
while(b<n)
{
re+=s[b];
b+=2*(numRows-1);
}
}
else
{
int b2=i+2*(numRows-1-i);
while(b<n)
{
re+=s[b];
if(b2<n)
{
re+=s[b2];
}
b+=2*(numRows-1);
b2=b+2*(numRows-1-i);
}
}
}
}
return re;
}
};
而且这个会快一些......