一. 題目描述
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"
.
二. 題目分析
這道題是就是原來的字符串的元素與鋸齒化後的字符串的元素之間的關系,我們可以舉個例子來說明,假設原來的字符串的每一個字符的下標為0,1,2,3,…, 12分別進行行數為3,4,5行的鋸齒化。
定義將原來的字符串按照nRows行進行鋸齒化,定義 Step= 2 * nRows - 2; 從上面的例子可以看出,對於第i行,有下面兩種情況:
1.對於第0行和第(nRows - 1)行,每一行的元素為i, i+Step, i+2*Step,…;
2.對於其他的行來說,每一行的元素為i, Step - i, i + Step, 2*Step - i,…。
三. 實例代碼
class Solution {
public:
string convert(string s, int nRows)
{
const int Size = s.size();
if ((Size <= nRows) || (nRows == 1))
{
return s;
}
const int Step = 2 * nRows - 2;
string Result;
for (int RowIndex = 0; RowIndex < nRows; RowIndex++)
{
int Index = RowIndex;
if ((RowIndex == 0) || (RowIndex == (nRows - 1)))
{
while (Index < Size)
{
Result.push_back(s[Index]);
Index = Index + Step;
}
continue;
}
int SecondIndex = Step - Index;
while ((Index < Size) || (SecondIndex < Size))
{
if (Index < Size)
{
Result.push_back(s[Index]);
Index = Index + Step;
}
if (SecondIndex < Size)
{
Result.push_back(s[SecondIndex]);
SecondIndex = SecondIndex + Step;
}
}
}
return Result;
}
};
四. 小結
這道題主要是尋找原來是字符串的元素坐標與鋸齒化後的字符串的坐標關系。