1. 程式人生 > 其它 >LeetCode刷題之路:38. 外觀數列

LeetCode刷題之路:38. 外觀數列

技術標籤:力扣LeetCode資料結構python演算法leetcode外觀數列

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

「外觀數列」是一個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。

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

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
輸出:“1”
解釋:這是一個基本樣例。
示例 2:

輸入:n = 4
輸出:“1211”
解釋:
countAndSay(1) = “1”

countAndSay(2) = 讀 “1” = 一 個 1 = “11”
countAndSay(3) = 讀 “11” = 二 個 1 = “21”
countAndSay(4) = 讀 “21” = 一 個 2 + 一 個 1 = “12” + “11” = “1211”

提示:
1 <= n <= 30

#最直觀的思路
這道題的核心是如何去描述前一項得到當前項
例如第 5 項,111221。現在要描述此項獲得第 6 項,現在我們直觀來看,
有 3 個 1,2 個 2,1 個 1,那麼記為 312211。
當給定任意的正整數n時,我們可以通過下面雙指標的做法,求得第n項:
首先定義變數 num 記錄初始項(第一項為 1),隨後定義變數a記錄當前項,再初始化num為 ‘’,方便記錄下一項;

定義雙指標start,end 均指向序列項的頭部,end用於統計元素出現的次數;
由於給定的n,這裡由第 2 項開始逐項對前一項進行描述


class Solution:
    def countAndSay(self, n: int) -> str:
        num = '1'
        if n == 1:
            return num
        else:
            for i in range(1, n):
                a = num
                num = ''
                start = 0
                end = 0
                while end < len(a):
                    while end < len(a) and a[start] == a[end]:
                        end += 1
                    num += str(end - start) + a[start]
                    start = end
            return num