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"
.
问题描述:总的来说,就是将字符串按“之”字形排列。然后输出每一行的拼接作为最后结果。在写下来之后我们可以发现这样排列是有一定规律的。首先,所有行的重复周期都是2*nRows - 2,而对于非首行和尾行(即nRows行),还要额外重复一次,重复的这一次距离本周期起始字符的距离是2*nRows-2-2*i,其中i为第几行
最终代码如下:
class Solution {
public:
string convert(string s, int numRows) {
int len = s.length();
if(len<=1 || numRows<2) return s;
string newstr = "";
int lag = 2*numRows-2;
for(int i=0;i<numRows;i++){
for(int j=i;j<len;j+=lag){
newstr += s[j];
if(i>0&&i<numRows-1){
int t = j + lag - (2 * i);
if(t<len){
newstr += s[t];
}
}
}
}
return newstr;
}
};