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 R
And 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 s, int numRows);
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3 Output: "PAHNAPLSIIGYIR"
Example 2:
Input: s = "PAYPALISHIRING", numRows = 4 Output: "PINALSIGYAHRPI" Explanation: P I N A L S I G Y A H R P I
代码:
class Solution {
public:
string convert(string s, int numRows) {
int len=s.length();
string ans="";
if(len==1 || len==2 || numRows==1){
ans=s;
return ans;
}
long l=0;
while((2*numRows-2)*(l-1)<len) //求出第一行字符数目
l++;
l--;
int i,j,k;
for(j=0;j<l;j++) //输出第一行
ans+=s[(2*numRows-2)*j];
for(i=1;i<numRows-1;i++){ //输出第2~(numRows-1)行
j=i; //j和k是每一个Z型序列,该行字符所在的位置
k=2*numRows-2-i;
while(1){
if(j<len)
ans+=s[j];
else
break;
if(k<len)
ans+=s[k];
else
break;
j=j+2*numRows-2; //移到下一个Z型序列
k=k+2*numRows-2;
}
}
for(j=0;j<l-1;j++) //输出最后一行
ans+=s[(2*numRows-2)*j+numRows-1];
if(((2*numRows-2)*j+numRows-1)<len)
ans+=s[(2*numRows-2)*j+numRows-1];
return ans;
}
};
总结:这题就是找规律,没什么难的。
没想到,随便写的代码,性能还有这么好,嘻嘻