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 conve rsion given a number of rows:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3)
should return "PAHNAPLSIIGYIR"
.
解题思路:ZigZag转化的结果其实算是倒Z字图像的并列,所以这是个周期性的图行,我们可以"",作为一个周期,周期的长度是2*ROW-2,,在考虑周内的情况,因为,除了第一行和最后一行,其余行在周期内会有两个字母,通过简单的推导他们的间隔是2(ROW-ROWi)-2,ROWi是第几行的行数,;所以代码如下:
class Solution {
public:
string convert(string s, int numRows) {
if (numRows <= 1|| numRows >= s.size()) {
return s;
}
string s_c="";
int i,j,j2;
int maxCd = 2 * numRows - 2;
int cd;
for (i = 0; i < numRows; i++) {
j = i;
cd = 2 * (numRows - i) - 2;
while (j < s.size()) {
s_c += s[j];
j2 = j + cd;
if(j2 <s.size()&& cd != 0&& cd != maxCd){
s_c += s[j2];
}
j = j+ maxCd;
}
}
return s_c;
}
};
运行结果: