题目
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"
.
思路
字符是按照行循环来放的,比如题目中的按照0,1,2,1,0,1,2.。。。来依次放字符,然后按行读取。因此重点就是找字符对应的行。前面也看到行变化是先增到nRows-1,然后递减到0.因此只要根据这两个边界然后设置一个step(1或-1)来实现行数的循环变化。最后把各行的字符串连起来就可以了
代码
class Solution {
public:
string convert(string s, int nRows) {
if (nRows <= 1)
return s;
const int len = (int)s.length();
string *str = new string[nRows];
int row = 0, step = 1;
for (int i = 0; i < len; ++i)
{
str[row].push_back(s[i]);
if (row == 0)
step = 1;
if (row == nRows - 1)
step = -1;
row += step;
}
s.clear();
for (int j = 0; j < nRows; ++j)
{
s.append(str[j]);
}
delete[] str;
return s;
}
};