[leet code] Count and Say

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.

============

Analysis:

Solution of this problem is strait forward, i.e. utilizing iteration to implement the rule of "count-and-say".

To be specific, when we are constructing the current sequence, we read the previous sequence.  Two types of information need to be read: "what number is it" and "how many times it continually repeated".  When a new number read, we add this information to the current sequence and reset the "what number is it" and "how many times it continually repeated".  We continue this process till all number of the previous sequence read.

public class Solution {
    public static String countAndSay(int n) {
        if(n<1) return "";
        if(n==1) return "1";
        
        StringBuffer pre = new StringBuffer("1"); // 1st sequence
        StringBuffer curr = null; // ith current sequence 
        
        for(int i=2; i<=n; i++){ // cualculate the following sequences
            curr = new StringBuffer();
            char digit = pre.charAt(0); // current countering digit
            int dupCount = 0; // counter for repeating numbers
            
            for(int j=0; j<pre.length(); j++){ // read the previous sequence
                if(digit == pre.charAt(j)) dupCount++;
                else{// a new number read
                    // add the previous number read
                    curr.append(dupCount);
                    curr.append(digit);
                    // reset counter for new digit
                    digit = pre.charAt(j);
                    dupCount = 1; // 1 is for the current digit
                }
            }
            
            if(dupCount != 0){ // last part of the sequence (the last number reached)
                curr.append(dupCount);
                curr.append(digit);
            }
            // after current sequence constructed, set it as previous sequence and process next one
            pre = curr;
        }
        return curr.toString();
    }
}




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值