*38. Count and Say

1. 原始題目

報數序列是一個整數序列,按照其中的整數的順序進行報數,獲得下一個數。其前五項以下:spa

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 被讀做  "one 1"  ("一個一") , 即 11
11 被讀做 "two 1s" ("兩個一"), 即 21
21 被讀做 "one 2",  "one 1" ("一個二" ,  "一個一") , 即 1211code

給定一個正整數 n(1 ≤ n ≤ 30),輸出報數序列的第 n 項。blog

注意:整數順序將表示爲一個字符串。遞歸

 

示例 1:字符串

輸入: 1
輸出: "1"

示例 2:io

輸入: 4
輸出: "1211"

2. 思路

這個題目可能比較拗口。其實思路很簡單:對於每一個數字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]。

好了,也就是說咱們要在上一次的基礎上進行分解,計數,而後加入到當前列表中。這種有前後關係的操做第一想法就是遞歸

 

3. 思路

 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 

哈哈,不喜歡遞歸的我也開始用遞歸了。。。

相關文章
相關標籤/搜索