原题附上:
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"
.
第一次看到这个题目的同学可能不太理解zigzag格式到底是怎么样的,别急,下面就上题目给出的例子做一个较为简单的图示。
假设nRows为4,则其zigzag的格式变为:
P I N
A L S I G
Y A H R
P I
反正就是一个类似Z型的分布。
好了,在了解完ZigZag的格式之后,上代码(C++)
class Solution {
public:
string convert(string s, int numRows) {
if (s == "" || numRows == 1)
return s;
string str = "";
int groupOfLen = 2 * numRows - 2; // 每组的长度
for (int row = 0; row < numRows; row++) //按从第0行到第numRows-1行的顺序进行遍历
{
if (row == 0 || row == numRows - 1) //这里处理第0行和第numRows-1行
for (int currentrow = row; currentrow < s.length(); currentrow += groupOfLen)
str += s[currentrow];
else // 这里处理夹在第0行和第numRows-1行之间的行
{
int current_row = row;
bool flag = true;
int lenOfGroup1 = 2 * (numRows - 1 - row); // 中间行各元素的索引
int lenOfGroup2 = groupOfLen - lenOfGroup1;
while (current_row < s.length())
{
str += s[current_row];
if (flag == true)
current_row += lenOfGroup1;
else
current_row += lenOfGroup2;
flag = !flag;
}
}
}
return str;
}
};