qbzt週末刷題班5題解
阿新 • • 發佈:2020-11-02
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-j
個s.charAt(j)
- 更新
j = k
- k = j,找到所有相等的數 最後執行
時間複雜度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(); } }