关闭

[LeetCode]ZigZag Conversion

253人阅读 评论(0) 收藏 举报
分类:

虽然是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;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:55521次
    • 积分:2169
    • 等级:
    • 排名:第17428名
    • 原创:162篇
    • 转载:9篇
    • 译文:0篇
    • 评论:13条
    文章分类
    最新评论