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”.
分析:
要找到数学规律。
n=4:
P I N
A L S I G
Y A H R
P I
n=5:
P H
A S I
Y I R
P L I G
A N
所以,对于每一层垂直元素的坐标(i, j) = (2 * n - 2) * j + i
对于没两层垂直元素之间的插入元素(斜对角元素),(i , j ) = index + (n - i - 1) * 2。
index为该行前一个垂直元素的索引值。
举例:
n = 4时,
坐标为(0, 1)的垂直元素I的索引值index = (2 * 4 - 2) * 1 + 0 = 6, 即s[index]=s[6]=”I”;
坐标为(2, 1)的斜对角元素A的索引值index = Y的索引值 + (4 - 2 - 1) * 2 = 2 + 2 = 4, 即s[4] = “A”;
注意:首尾两行元素全为垂直元素。
string convert(string s, int nRows) {
if (nRows <= 1 || s.size() <= 1) return s;
string result;
for (int i = 0; i < nRows; i++)
{
for (int j = 0, index = i; index < s.size();
j++, index = (2 * nRows - 2) * j + i) {
result.append(1, s[index]); // 垂直元素
if (i == 0 || i == nRows - 1) continue; // 斜对角元素
if (index + (nRows - i - 1) * 2 < s.size())
result.append(1, s[index + (nRows - i - 1) * 2]);
}
}
return result;
}