LeetCode 38. Count and Say

题目
这是我在LeetCode中做到的第一道需要用到递归思想的题目,因为自己对递归掌握的不好,这里做个笔记:

题目大意为我们有一个 Count-and-say 的字符串序列,他的第一个元素是‘1’,后一个元素是读前一个而得到的字符串,比如说这里第二个元素就是“11”意思是一个1,那第三个就是“21”,两个1,第四个元素是“1211”,一个2一个1。

这就有点类似斐波那契数列的感觉了,所以我们可以想到应该用递归的思想去做这题。

AC代码如下:

string read(string s){
    string say = "";
    int count = 1;
    char now = s[0];

    for(int i = 1; i < s.size();i++){
        if(s[i] == now){
            count++;
        }else{
            char count_char = count + '0';
            say = say + count_char + now ;
            now = s[i];
            count = 1;
        }
    }
    char count_char = count + '0';
    say = say + count_char + now ;
    return say;
}

string countAndSay(int n) {
    string say = "1";
    int i = 1;
    while(i < n){
        say = read(say);
        i++;
    }
    return say;
}

countAndSay函数只是控制递归次数的,
主要函数为read函数。
首先分析read函数里的变量的作用:
say是要返回的字符串,now是我当前读到那个数字,count记录有几个now(也就是有几个我正读到的这个数字连在一起)。

然后遍历s字符串,s字符串就是我要得到的Count-And-Say 字符串元素的前一个元素。

now一开始是s的第一个元素,然后遍历从s[1]开始(也就是第二个元素),看s[1]和now是否一样,一样就count++,如果不一样了,那就说明这个now到此为止了,在else中先把count转为char类型,然后把新的这个now的读法接在原本读好的say后面,即say = say + count_char + now。然后这里要把now变成s[i],count变回1,因为我要开始读下一个数字了。

还有就是记得出循环的时候,最后一个now是还没有在else中被加进say里面的,所以出循环还要有一个say = say + count_char + now。

然后return say就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值