LeetCode刷題之路:38. 外觀數列
阿新 • • 發佈:2020-12-29
技術標籤:力扣LeetCode資料結構python演算法leetcode外觀數列
給定一個正整數 n ,輸出外觀數列的第 n 項。
「外觀數列」是一個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。
你可以將其視作是由遞迴公式定義的數字字串序列:
countAndSay(1) = “1”
countAndSay(n) 是對 countAndSay(n-1) 的描述,然後轉換成另一個數字字串。
前五項如下:
-
1
-
11
-
21
-
1211
-
111221
第一項是數字 1
描述前一項,這個數是 1 即 “ 一 個 1 ”,記作 “11”
描述前一項,這個數是 11 即 “ 二 個 1 ” ,記作 “21”
描述前一項,這個數是 1211 即 “ 一 個 1 + 一 個 2 + 二 個 1 ” ,記作 “111221”
要 描述 一個數字字串,首先要將字串分割為 最小 數量的組,每個組都由連續的最多 相同字元 組成。然後對於每個組,先描述字元的數量,然後描述字元,形成一個描述組。要將描述轉換為數字字串,先將每組中的字元數量用數字替換,再將所有描述組連線起來。
示例 1:
輸入:n = 1
輸出:“1”
解釋:這是一個基本樣例。
示例 2:
輸入:n = 4
輸出:“1211”
解釋:
countAndSay(1) = “1”
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為 ‘’,方便記錄下一項;
由於給定的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