[38] Count and Say

1. 題目描述

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.

Count and Say的串從1開始,首先將1讀爲11,之後將11讀爲21,將21讀爲1211,將1211讀爲111221,依次類推,求出第n個串,n=1時,爲1。

2. 解題思路

一開始讀錯題了,以爲是隨意給一個數,之後將這個數讀出來。後來發現不是這樣的O.O…題目的意思是,從1開始重複讀,先讀1,然後讀1產生的結果,然後繼續往後讀下去,返回第n個結果。那麼一開始寫的Code1也不是沒有用,可以在Code1的基礎上改進一下。Code1相當於,讀1輪產生的數,那麼Code2只需要將上一次讀的內容作爲下一次的輸入即可。Code1大體的思路爲對於一個數111221,使用一個當前值保存上一個的值,如果不相等,就輸出上一個的值和上一個值得個數,且改變當前的值,如果相等就爲當前值的計數加1。需要注意的是讀到最後一串的時候跟後面的比較會越界,所以最後一串需要單獨輸出。Code2的思路爲將Code1作爲中間的一部分,使用一個循環套起來,每一次的結果作爲上一次的輸入。

3. Code

// Code1:以爲參數int是給定的一個隨意的數,把這個數的編碼計算出來即可。。
import java.lang.StringBuffer;

public class Solution {
    public String countAndSay(int n) {
        // 將int轉換爲String
        String giveNum = String.valueOf(n);
        // 獲取字符串長度
        int length = giveNum.length();
        int number = 1;  // 保存一輪的個數
        StringBuffer sb = new StringBuffer();
        for(int i = 0, j = i + 1; j < length; ++j)
        {
            if(giveNum.charAt(i) != giveNum.charAt(j))
            {
                // 遇到第一個不重複的字符
                sb.append(number).append(giveNum.charAt(i));
                i = j;
                number = 1;
            }else{
                number++;
            }
        }
        // 最後一串字符,j越界
        sb.append(number).append(giveNum.charAt(length-1));
        return sb.toString();
    }
}
// Code2:
import java.lang.StringBuffer;

public class Solution {
    public String countAndSay(int n) {
        if(n <= 0) return "";
        String s = "1";
        // 做n輪
        for(int i = 1; i < n; ++i)
        {
            StringBuffer sb = new StringBuffer();
            // 獲取字符串長度
            int length = s.length();
            int number = 0;  // 保存一輪的個數
            char cur = s.charAt(0);
            for(int j = 0; j < s.length(); ++j){
                if(cur != s.charAt(j))
                {
                    // 遇到第一個不重複的字符
                    sb.append(number).append(cur);
                    cur = s.charAt(j);
                    number = 1;
                }else{
                    number++;
                }
            }
            // 最後一串字符,j越界
            sb.append(number).append(s.charAt(length-1));
            s = sb.toString();
        }
        return s;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章