leetcode: Count and Say

159 篇文章 0 订阅

问题描述:

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();
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值