1. 程式人生 > 實用技巧 >qbzt週末刷題班5題解

qbzt週末刷題班5題解

LeetCode38 外觀數列

題目描述

給定一個正整數 n ,輸出外觀數列的第 n 項。

你可以將其視作是由遞迴公式定義的數字字串序列:

  • countAndSay(1) = "1"

  • countAndSay(n) 是對 countAndSay(n-1) 的描述,然後轉換成另一個數字字串。

樣例

1.     1
2.     11
3.     21
4.     1211
5.     111221
第一項是數字 1 
描述前一項,這個數是 1 即 “ 一 個 1 ”,記作 "11"
描述前一項,這個數是 11 即 “ 二 個 1 ” ,記作 "21"
描述前一項,這個數是 21 即 “ 一 個 2 + 一 個 1 ” ,記作 "1211"
描述前一項,這個數是 1211 即 “ 一 個 1 + 一 個 2 + 二 個 1 ” ,記作 "111221"

演算法分析

模擬題:

  • 一開始狀態"1",操作n-1次,
  • 給定一個字串,計數
    • k = j,找到所有相等的數 最後執行k++, 所以總共有k-js.charAt(j)
    • 更新j = k

時間複雜度O(n)

Java程式碼

class Solution {
    public String countAndSay(int n) {
        StringBuilder ans = new StringBuilder("1");
        for(int i = 0; i < n-1; i++){
            StringBuilder t = new StringBuilder("");
            for(int j = 0; j < ans.length();){
                int k = j;
                while(k < ans.length() && ans.charAt(k) == ans.charAt(j)){
                    k++;
                }
                t.append(k-j).append(ans.charAt(j));
                j = k;
            }
            
            ans = t;
        }
        return ans.toString();
    }
}