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"
.
z字形填字母,推导一个简单的关系就行了
第一行和最后一行在拐点处只有一个字母,所以特殊处理;
中间的每一行按奇偶列处理,首先(cnt-1)*(numRows-1)是不论哪一列都必须有的;
然后奇数列从上往下填,偶数列从下往上填,详见代码;
class Solution {
public:
string convert(string s, int numRows) {
if(numRows==1) return s;//只有一行特判,否则下面第一行和最后一行会重复两次
int len=s.length(),now=0;
string result;
while(now<len)//第一行
{
result+=s[now];
now+=(2*numRows-2);
}
for(int i=1;i<numRows-1;i++)
{
now=0;
int cnt=0;
while(now<len)
{
cnt++;
if(cnt%2)
now=(cnt-1)*(numRows-1)+i;//从上往下
else
now=(cnt-1)*(numRows-1)+numRows-i-1;//从下往上
if(now>=len) continue;
// cout<<now<<endl;
result+=s[now];
}
}
now=numRows-1;
while(now<len)//最后一行
{
result+=s[now];
now+=(2*numRows-2);
}
return result;
}
};