码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode ZigZag Conversion

时间:2014-08-17 21:21:32      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   for   ar   

class Solution {
public:
    string convert(string s, int nRows) {
        int len = s.length();
        if (len < 2 || nRows == 1 || len < nRows) return s;
        vector<string> cols;

        int si = 0;
        int ri = 0;
        
        while (si < len) {
            bool inacol = cols.size() % (nRows-1) == 0;
            
            if (!inacol) {
                for (int i=0; i<nRows - 2 && si <len; i++, si++) {
                    cols.push_back(s.substr(si, 1));      // a char as a single column
                }
                continue;
            }
            
            cols.push_back(string());

            for (int i=0; i<nRows && si<len; i++, si++) {
                cols.back().push_back(s[si]);   // all char in a column
            }
        }

        string res;
        int nCols = cols.size();

        int stepa = nRows - 1;
        int stepb = 0;
        
        for (int i=0; i<nRows; i++) {
            bool usea = false;
            int last = -1;
            for (int j = 0; j < nCols; j += usea ? stepa : stepb) {
                usea = !usea;
                if (j == last) continue;
                last = j;
                
                int r = i, c = j;
                
                if (cols[c].length() < 1) break;
                
                if (c % (nRows - 1) != 0) {
                    r = 0;
                } else if (cols[c].length() - 1 < r) {
                    break;
                }
                res.push_back(cols[c][r]);
            }
            --stepa, ++stepb;
        }
        cols.clear();
        return res;
    }
};

一般来说那么长,时间又是100ms+的代码定不是好的!

 

发现一个以前没注意到的问题,如下代码:

    string a("abc");
    string b;
    b.push_back(a[10]);
    cout<<b.length()<<endl;

编译运行并不会报错,虽然其中a[10]的操作明显越界了,但是与数组不同,字符串的下标操作当越界时会返回一个NULL字符,去http://www.cplusplus.com/查了一下,上面是这么说的:

If pos is equal to the string length, the function returns a reference to a null character (charT()).

从实际测试来看,不仅仅是当str[pos]中的pos == str.length()时, 当其大于字符串长度时也是如此。虽然这样的过程是一番好意,但是有时候却让错误变得更难以发现,如下代码:

    string a("abc");
    string b(a);
    b.push_back(a[10]);
    
    cout<<a<<","<<b<<endl;
    cout<<(a == b)<<endl;

输出a, b时,他们是完全一样的,然而因为b比a多了NULL,在等值比较时就不相等了,非常令人困惑。当然根源还是,码农不小心。。。

LeetCode ZigZag Conversion,布布扣,bubuko.com

LeetCode ZigZag Conversion

标签:style   blog   http   color   os   io   for   ar   

原文地址:http://www.cnblogs.com/lailailai/p/3918191.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!