ZigZag Conversion
The string "PAYPALISHIRING"
is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N A P L S I I G Y I RAnd then read line by line:
"PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3)
should return
"PAHNAPLSIIGYIR"
.
开始不懂ZigZag什么东东,看了这个
/*n=numRows
Δ=2n-2 1 2n-1 4n-3
Δ= 2 2n-2 2n 4n-4 4n-2
Δ= 3 2n-3 2n+1 4n-5 .
Δ= . . . . .
Δ= . n+2 . 3n .
Δ= n-1 n+1 3n-3 3n-1 5n-5
Δ=2n-2 n 3n-2 5n-4
*/
发现规律
1 +2*(n-1) +2(1-1)
2 +2(n-2) +2*(2-1)
i +2(n-i) +2*(i-1)
同时注意只有一个数的情况
class Solution {
public:
string convert(string s, int numRows) {
int slength=s.length();
string res=s;
int reslength=0;
int change=0;
for(int i=1; i<=numRows; i++)
{
int index=i;
int zerosnum=0;
change=1;
while(index<=slength)
{
zerosnum=0;
if(change!=0)
{
res[reslength++]=s[index-1];
}
change=(2*(numRows-i));
index+=change;
if(change!=0)
{
if(index>slength)
break;
res[reslength++]=s[index-1];
}
else
{
zerosnum++;
}
change=2*(i-1);
if(change==0)
{
zerosnum++;
}
index+=change;
if(zerosnum==2)
break;
}
}
return res;
}
};