leetcode 38 Count and Say

描述:

规则有点奇怪,第n个数 数出上个数的位。

如3122,表示上个数有3个1,2个2,即11122。

现定义:

1为1

2为11,表示1个1

3为21,表示2个1

4为1211,表示1个2,1个1

解决:

注意其中出现的push_backmove

原本用+号和赋值,效率真的慢,为8ms左右。

+号改为push_back,只操作一个字符,尾部插入,快。

  但注意,count必定不大于9,因为如果存在连续的某个数如111111,中间一段表示1个1,1个1,可以合并,所以不存在超过3个连续的。

=改为move,其实此处并未有太大效率提升,由于string构造损耗不大。move发挥作用的地方在于移动构造等构造析构代价大的地方。具体参看详细的move作用,C++11特性。

string countAndSay(int n) {
    if (n == 1) return ("1");
    if (n == 2) return ("11");
    string ret = "11";

    for (int i = 3; i <= n; i++) {
        string pr = "";
        int count = 1;
        char now;
        char last = ret[0];

        for (int j = 1; j < ret.size(); j++) {
            now = ret[j];
            if (now == last)
                count++;
            else {
                pr.push_back(count + '0');
                pr.push_back(last);
                count = 1;
            }
            last = now;
        }
        pr.push_back(count + '0');
        pr.push_back(last);
        ret = pr;
        ret = move(pr);  // 移动函数
    }
    return ret;
}

 

posted on 2018-01-22 18:32  willaty  阅读(120)  评论(0编辑  收藏  举报

导航