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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章