leetcode: Count and Say

本文介绍了一种生成计数并说序列的方法,通过迭代计算每个数字出现的次数,并将其转化为序列中的数字和计数。文章提供了一个简洁的Java实现方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

The count-and-say sequence is the sequence of integers beginning as follows:
1, 11, 21, 1211, 111221, ...

1 is read off as "one 1" or 11.
11 is read off as "two 1s" or 21.
21 is read off as "one 2, then one 1" or 1211.

Given an integer n, generate the nth sequence.

Note: The sequence of integers will be represented as a string.

原问题链接:https://leetcode.com/problems/count-and-say/

 

问题分析

  因为这里是根据一个数字来递推另外一个串。最开始的情况是只有字符串"1",这也是针对n = 1的情况。在后面,对于任何一个串来说,我们需要在遍历的时候计算当前的那个元素出现的次数。在碰到相同元素的时候对计数加一,否则说明碰到另外的一个数字了,需要将当前的数字和出现的次数放到一个串里,然后再将当前不同的那个值设为当前值。在循环遍历结束后,还要将当前的这个值和出现的次数加入到串里。这样就得到了一个一次转换后的结果。

  对于给定数字n来说它无非就是按照上述的变换执行了n次。所以可以很容易的得到如下的代码:

 

public class Solution {
    public String countAndSay(int n) {
        String s = "1";
        for(int i = 1; i < n; i++) {
            s = countNumbers(s);
        }
        
        return s;
    }
    
    private String countNumbers(String s) {
        if(s.length() == 1) {
            return 1 + s;
        }
        char cur = s.charAt(0);
        int count = 1;
        StringBuilder builder = new StringBuilder();
        for(int i = 1; i < s.length(); i++) {
            if(s.charAt(i) == cur)
                count++;
            else {
                builder.append(count + "" + cur);
                cur = s.charAt(i);
                count = 1;
            }
        }
        builder.append(count + "" + cur);
        return builder.toString();
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值