leetcode 38. Count and Say(计数和读)

在这里插入图片描述
Example 1:

Input: n = 1
Output: “1”
Explanation: This is the base case.
Example 2:

Input: n = 4
Output: “1211”
Explanation:
countAndSay(1) = “1”
countAndSay(2) = say “1” = one 1 = “11”
countAndSay(3) = say “11” = two 1’s = “21”
countAndSay(4) = say “21” = one 2 + one 1 = “12” + “11” = “1211”

Constraints:
1 <= n <= 30

这是一个类似于归纳法的问题,
countAndSay(1) = “1”,
后面基于这个归纳,每一步找出连续数字(num)组成的substring中num的个数(cnt),
然后字符串就为cnt + num,这样每个substring的cnt + num接起来,
直到读到第n步.

注意"1211"并不是“3个1,1个2”,而是要看连续的substring,
应该是"1个1,1个2,2个1“ —> ”111221“

思路:

没啥特别的,就是一步一步推,类似归纳法。
先是countAndSay(1) = “1”,
然后我们知道第n-1步的countAndSay(n-1) = s,
再根据s推counAndSay(n).

统计连续数字的个数,
出现不同数字时,在string中加入前面一个数字的cnt + num,
注意不要忘了最后一个数字。

public String countAndSay(int n) {
    if(n == 1) return "1";
    //第n-1步的字符串
    String s = countAndSay(n-1);
    
    char ch = s.charAt(0); //n>=1,所以直接记下第一个数字
    int cnt = 1;
    StringBuilder sb = new StringBuilder();
    
    for(int i = 1; i < s.length(); i++) {            
        //遇到新的字母,总结上一字母
        if(s.charAt(i) != ch) {
            
            sb.append(cnt);
            sb.append(ch);
            
            ch = s.charAt(i);
            cnt = 0;
        }
        cnt ++;
    }
    sb.append(cnt);
    sb.append(ch);
    
    return sb.toString();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值