報數序列是一個整數序列,按照其中的整數的順序進行報數,獲得下一個數。其前五項以下:spa
1. 1 2. 11 3. 21 4. 1211 5. 111221
1
被讀做 "one 1"
("一個一"
) , 即 11
。11
被讀做 "two 1s"
("兩個一"
), 即 21
。21
被讀做 "one 2"
, "one 1"
("一個二"
, "一個一"
) , 即 1211
。code
給定一個正整數 n(1 ≤ n ≤ 30),輸出報數序列的第 n 項。blog
注意:整數順序將表示爲一個字符串。遞歸
示例 1:字符串
輸入: 1 輸出: "1"
示例 2:io
輸入: 4 輸出: "1211"
這個題目可能比較拗口。其實思路很簡單:對於每一個數字m,按照以下方式獲得其下一個數字:依次讀取m中每一個連續的數字,將該數字的連續次數和該數字放到新的串中。class
例如:m=1211,那如何獲得111221? 先創建一個空列表results=[]基礎
首先將m中每一個連續數字分解: 1 2 11di
1連續次數爲1。results=[1,1]。while
2連續次數爲1。更新results=[1,1,1,2]。
11連續次數爲2。更新results=[1,1,1,2,2,1]。
好了,也就是說咱們要在上一次的基礎上進行分解,計數,而後加入到當前列表中。這種有前後關係的操做第一想法就是遞歸。
1 class Solution: 2 def countAndSay(self, n: int) -> str: 3 if n==1: return "1" # 設置遞歸結束條件,就是n爲1的狀況 4 else: 5 before = self.countAndSay(n-1) # 否則的話,咱們先獲取上一次的結果 6 k = i =0 # k和i搭配用來計算當前的字符以及其出現的次數 7 results = [] 8 while(i<len(before)): 9 while (i <len(before)) and(before[k]==before[i]): # 連續的字符串 10 i+=1 11 results.extend([str(i-k),before[k]]) # i-k爲出現的次數,before[k]爲當前的字符 12 k=i 13 results = "".join(results) # 由於結果是串,因此再轉換一下 14 return results
哈哈,不喜歡遞歸的我也開始用遞歸了。。。