您的位置:首页 > 编程语言 > C语言/C++

ZigZag Conversion

2016-07-12 21:01 423 查看
题目描述:

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 text, int nRows);

convert("PAYPALISHIRING", 3)
 should
return 
"PAHNAPLSIIGYIR"
.
解题思路:

根据zigzag pattern的规律,把每两列当做一个周期,一个周期包含的字符的个数为rows+rows-2。

对于一个周期的内的字符,除了第一行和最后一行包含一个字符以外,其他行都包含两个字符。

根据周期的长度和行号可以求出每一行的每一个字符在源字符串中的位置。

AC代码如下:

class Solution {
public:
string convert(string s, int numRows) {
string ans;
if (numRows == 1){
ans = s;
return ans;
}
int a = numRows * 2 - 2;
int n = s.size();
int j = 0;
while (j*a < n){
ans.push_back(s[j*a]);
j++;
}
for (int i = 1; i < numRows - 1; i++){
j = 0;
while (j*a + i < n){
ans.push_back(s[j*a + i]);
if (j*a + a - i < n){
ans.push_back(s[j*a + a - i]);
}
j++;
}
}
j = 0;
while (j*a + numRows - 1 < n){
ans.push_back(s[j*a + numRows - 1]);
j++;
}
return ans;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息