赵乐ACM

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
nRows = 2
0 2 4 6 8
1 3 5 7 9
nRows = 3
0   4   8     12    16
1 3 5 7 9  11 13 15
2   6   10    14
nRows = 4
0     6       12       18
1   5 7    11 13    17 19
2 4   8 10    14 16
3     9       15

可以发现规律

1. 一块区域,即一个类似于“v”的形状为一个区域,区域的size是nRows*2-2;

2. 在每一个区域中,只有第一行和最后一行有一个数,其余行每行包含两个数;

3. 在除第一行和最后一行的其余行,第二个数和第一个数的差距是size-i*2。

上代码

class Solution {
public:
    string convert(string s, int nRows) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if (nRows <= 1)
            return s;
        int zigSize = nRows * 2 - 2;
        string rst = "";
        for (int i = 0; i < nRows; i++)
        {
            for (int j = i; j < s.length(); j += zigSize)
            {
                rst += s[j];
                if (i > 0 && i < nRows - 1)
                {
                    if (j+zigSize-2*i < s.length())
                        rst += s[j+zigSize-2*i];
                }
            }
        }
        return rst;
    }
};

 

posted on 2013-07-22 22:22  赵乐ACM  阅读(313)  评论(0编辑  收藏  举报