一、题目描述

二、算法原理

我们可以从字符串的下标表示来寻找题目的规律:
第一行:0 到 4 之间隔着 d = 2 * numrows - 2,相当于数学里面的等差数列的差值 d ,所以:当 i = 0 时,i、i + d、i + 2d、i + 3d 。。。。。i + kd 来表示第一行的取值。
最后一行:其实和第一行一样,i + d 、i + 2d 、i + 3d ......... i + kd 来表示最后一行的取值
中间行:我们把前两个为一组,因为 i + d 求出来的值和第一行和最后一行的求法一样,但是 i + d 前面那个数得 d - i,所以规律为:(i,d - i)、(i + d,2d - i )、(i + 2d,3d - i ).........( i + kd, (k - 1)d - i)。
注意:要注意越界问题,特别是中间行。
三、代码实现
cpp
class Solution {
public:
string convert(string s, int numRows) {
if(numRows == 1) return s;
string ret;
int d = 2 * numRows - 2;
for (int i = 0; i < numRows; i++)
{
if(i == 0 || i == numRows - 1)//处理第一行和最后一行
{
for(int k = i; k < s.size(); k += d) ret += s[k];
}
else//中间
{
int tmp = d - i;
for(int j = i; j < s.size();j += d)
{
ret += s[j];
if(tmp < s.size())//防溢出
{
ret += s[tmp];
tmp += d;
}
}
}
}
return ret;
}
};
