这是leetcode上的一个题目,挺好玩的,在此写下做以记录,其中参考了网友http://blog.csdn.net/zhouworld16/article/details/14121477的笔记,在此表示感谢。
题目如下:
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"
.
有上述两个示例可以总结出如下规律:
A) 对于第0行和第怒nRows-1行,两个字符之间相差的 pos = 2*nRows - 2;
B) 对于其他的第i行(i> 0 && i < nRows-1),以第一列为第0列,那么又可以将每行的字符所在列标记为奇数列和偶数列
i) 如果后面一个字符位于奇数列,那么两字符之间相差 pos = 2*(numRows - i) - 2;
ii) 如果后面一个字符位于偶数列,那么两字符之间相差 pos = 2*(i+1)-2;
需要注意的特殊情况:
1) 输入字符串长度s.size <= nRows,那么直接返回该s即可;
2) 注意nRows = 1的情况,因为这个时候其实输出的结果和输入一致,所以直接返回s即可;
3) 在获取字符的时候,要注意不能越界。
实现代码如下:
string convert(string s, int numRows)
{
if (numRows<= 0)
return s;
if (s.size() <= numRows || s.size() == 0 || numRows <= 1)
return s;
int i,j = 0,pos;
int len = s.size();
string tmp;
for (i = 0; i < numRows; i++ )
{
if (i == 0 || i == numRows - 1)
{
pos = 2*numRows - 2;
j = i;
while ( j < len)
{
tmp += s[j];
j += pos;
}
}
else
{
int k = 0;
j = i;
while(j < len)
{
if ( k%2 == 0 )
pos = 2*(numRows - i) - 2;
else
pos = 2*(i+1)-2;
tmp += s[j];
j += pos;
k++;
}
}
}
return tmp;
}