[LeetCode]ZigZag Conversion

虽然是easy的模式,但是还是写了好久。。
0 P H
1 A G I
i B F J
i+1 C E K
n-1 D L

直接以字符的下标来处理比较简单
关键是计算间隔
H 和P以及L和D之间的间隔是2(n-1)

F和B的间隔是2(n-1-i)
J和B的间隔也是2(n-1)或者是2(n-1-i)+2*i

循环的出口时下标>=len

class Solution {
public:
    string convert(string s, int numRows) {
        int len = s.size();
        string out;
        int idx;
        if(len ==1||numRows==1) return s;
        for(int i = 0; i != numRows;++i){
            idx = i;
            if(idx==0||idx == numRows-1){
                while(idx<len) {out.append(1,s[idx]); idx = idx + 2*(numRows -1);}
            }
            else{
                while(idx<len){
                    out.append(1,s[idx]);
                    idx = idx + 2*(numRows-1-i); 
                    if(idx>=len) break;
                    else{
                        out.append(1,s[idx]);
                        idx = idx + 2*i;
                    }

                }
            }

        }

        return out;


    }
};

有个神奇的代码
使用string数组或者vector大小为numRows,在字符下标i==0时,row向下生长,当字符下标j==numRows时,向上生长。

string convert(string s, int nRows) {

    if (nRows <= 1)
        return s;

    const int len = (int)s.length();
    string *str = new string[nRows];

    int row = 0, step = 1;
    for (int i = 0; i < len; ++i)
    {
        str[row].push_back(s[i]);

        if (row == 0)
            step = 1;
        else if (row == nRows - 1)
            step = -1;

        row += step;
    }

    s.clear();
    for (int j = 0; j < nRows; ++j)
    {
        s.append(str[j]);
    }

    delete[] str;
    return s;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/whzyb1991/article/details/46806693
个人分类: LeetCode
上一篇[LeetCode]Longest Palindromic Substring
下一篇[LeetCode]Reverse Integer
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭