LeetCode 38. 报数

image.png

解题思路

所谓报数,就是根据s1,报出一个s2.

  1. 首先我手上拿着s1的第1个数字number,并且配套的count = 1.
  2. 然后我看s1的第2个数字,哦,和我手上拿着的number相同,那我就让count++
  3. 然后我看s1的第3个数字,哦,和我手上拿着的number还相同,那我就还让count++
  4. 然后我看s1的第4个数字,哦,和我手上拿着的不同,那我做两件事:
    1. “打印”我手上的number和count
    2. 将这个新发现的不同的数字拿在我手上,并且将count置1.
  5. 然后我看s1的第5个数字,哦,你没有第5个数字啦?那说明我读完了,但是报数还没报完,还要将我手上的number和count都“打印出来”才算报完了s1,得到了s2。
    打印的意思就是将count和number连接到s2的末尾。

补充

这个打印的方法我用的是直接加,如果用to_string的方法将数字转成字符串再加到末尾也可以,但是效率会减少非常多。

代码

class Solution {
public:

    string countAndSay(int n) {
        string s1 = "1",s2 = "";  
        if(n == 1) return s1;
        for(int i=1; i<n; i++){//类似于动态规划的自底向上计算,知道第n-1个,才能知道第n个
            int count = 1;
            int number = s1[0] - '0';
            int j = 1;
            while(j<s1.size()){
                if(s1[j]-'0' == number){// 相等,就让count++,然后看下一个
                    count++;
                    j++;
                }else{ // 不相等,遇到新的了,先打印,再用手拿起新的数,重置count
                    s2 +=(count+'0');
                    s2 += (number+'0');
                    number = s1[j] - '0';
                    count = 1;
                    j++;
                }
            }
            // 读完了,将手上拿着的数字number和count都打印出来
            s2 += (count+'0');
            s2 += (number+'0');
            // 下面两句类似于用迭代法求斐波那契数列
            s1 = s2;
            s2 = "";
        }
        return s1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值