leetcode-38 Count and Say

开始没看懂题目,查了一下……囧。
思路很清晰,自己写的程序经过修改精简后,如下:

class Solution {
public:
string countAndSay( int n){
    if( n <= 0)//排除不符合条件的n
    return "";//输出为空
    string say = "1";//用于保存结果,初始化为“1”
    for( int i = 1; i < n; ++i)//输入有效时,总的循环框架
    {
        string tmp;//存储每次循环的中间结果
        int count = 0;//计算每个数字出现的次数
        char last = say[0];//作为参照的数

        //每个子循环的次数为当前数的字符串长度
        for( size_t j=0; j <= say.size(); ++j)
        {
            if(say[j] == last)//如果数字相同
            ++count;//计数加一
            else//数字不同
            {
                char num = '0' + count;//计算当前数字出现次数
                tmp = tmp + num + last;//将次数与数字存入中间变量
                last = say[j];//将参照的数改变(可看做在数组中向前移动)
                count = 1;//将计数置为1
            }
        }
        say = tmp;//将一次子循环结束的结果赋给say,判断条件,若可,继续循环,若不可,结束循环
    }
    return say;//返回结果
}
};

leetcode 显示时间为6ms.
教训:由于某些变量的定义地方选择不当,导致逻辑错误,很难检测出来,以后要小心小心再小小心!

然后在网上浏览,发现了高人写的更加优秀的程序,学习之后,佩服不已,故粘贴过来,仅供学习之用,在此感谢作者高人的分享。
地址:
http://www.cnblogs.com/codingmylife/archive/2012/09/05/2671655.html

class Solution {
public:
string ungarded_convert( const string &say )
    {
        stringstream ss;
        int count = 0;
        char last = say[0];
        for( size_t i=0; i <= say.size(); ++i )
        {
            if(say[i] == last )
            ++count;
            else
            {
                ss << count << last;
                count = 1;
                last = say[i];
            }
        }
        return ss.str();
    }

    string countAndSay(int n) {
        if( n <= 0)
        return string();
        string say = "1";
        for(int i=1; i < n; ++i)
        {
            say = ungarded_convert( say );
        }
        return say;
    }
};

这段程序跑了一下,leetcode时间为3ms!!
佩服得五体投地!
思路非常清晰,操作非常简单,效率非常之高!
由于自己还是菜鸟,第一次见识到stringstream的厉害,心中佩服。
路漫漫其修远兮……哎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值