题目
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)
And then read line by line:
"PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
示例
题解
- 这一道题的题意是给出一个字符串以及一个行数,这个行数代表着目的字符“Z”的高度大小
- 可以先列几个数字进行举例,所以有
![](https://i-blog.csdnimg.cn/blog_migrate/88a0856f367fae192a87c219b768d0cf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ec10db44329b497a15d9d1ac22d82c15.png)
- 不难从中发现规律,也就是令i为行数时,有:(其中k为{0 1 2 3 4 5...})
- i = 0时,需要插入的为(2n-2)*k
- i = 1 ~ n -2时,需要插入的为i+k(2n-2) 以及(k+1)(2n-2) - i (交替插入)
- i = n-1时,需要插入的为(2n-2)*k+(n-1)
- 所以按照以上的步骤实现代码就可以了
题解
代码如下:
class Solution {
public:
string convert(string s, int numRows) {
int length = s.length();
if(numRows == 1) return s;
if(length <= numRows){
return s;
}
string result = "";
int rwo = 0;
for(int i = 0; i*(2*numRows - 2) < length; i++){
result+=s[i*(2*numRows - 2)];
}
for(int i = 1; i < numRows - 1; i++){
for(int j = 0; (j*(2*numRows - 2) + i < length) || ((j + 1)*(2*numRows - 2) - i < length); j++){
if(j*(2*numRows - 2) + i < length){
result+=s[j*(2*numRows - 2) + i];
}
if((j + 1)*(2*numRows - 2) - i < length){
result+=s[(j + 1)*(2*numRows - 2) - i];
}
}
}
for(int i = 0; i*(2*numRows - 2) + numRows - 1 < length; i++){
result+=s[i*(2*numRows - 2) + numRows - 1];
}
return result;
}
};