1. 程式人生 > 其它 >第99期-基礎結構:字串 外觀數列

第99期-基礎結構:字串 外觀數列

1 問題描述

給定一個正整數n ,輸出外觀數列的第 n 項。
「外觀數列」是一個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。
你可以將其視作是由遞迴公式定義的數字字串序列:
1. countAndSay(1) = "1"
2. countAndSay(n) 是對 countAndSay(n-1) 的描述,然後轉換成另一個數字字串。
前五項如下:

.

1
11
21
1211
111221


第一項是數字 1
描述前一項,這個數是 1 即 “ 一 個 1 ”,記作 "11"
描述前一項,這個數是 11 即 “ 二 個 1 ” ,記作 "21"
描述前一項,這個數是 21 即 “ 一 個 2 + 一 個 1 ” ,記作 "1211"
描述前一項,這個數是 1211 即 “ 一 個 1 + 一 個 2 + 二 個 1 ” ,記作 "111221"

例如,數字字串 "3322251" 的描述如下圖:

示例 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"

示例 3:

輸入:n = 8
輸出:"1113213211"

from typing import
List class Solution: def countAndSay(self, n: int) -> str: #在此之間填寫程式碼 print(Solution().countAndSay(1)) print(Solution().countAndSay(4)) print(Solution().countAndSay(8))
View Code

2 解題思路

  • 標籤:字串
  • 使用遞迴函式,從n、n-1、n-2依次往前直到1
  • 分別計算每次的外觀數列

#3 解題方法

from typing import List
class Solution:
    
def countAndSay(self, n: int) -> str: if n==1:return '1' x,y=0,'' a=self.countAndSay(n-1) while x < len(a): m=1 while x+1<len(a) and a[x]==a[x+1]: m+=1 x+=1 y=y+str(m*10+int(a[x])) x+=1 return y print(Solution().countAndSay(1)) print(Solution().countAndSay(4)) print(Solution().countAndSay(8))
View Code

第1-3,16-18行:題目中已經給出的資訊,執行程式碼時要根據這些程式碼進行編輯
第4行:當n=1時,直接返回1,也是結束條件
第5行:定義變數x,y並分別賦值索引0,空字串''
第6行:定義變數a等於n-1時的外觀數列
第7行:當索引x值小於上一個外觀數列長度時,執行迴圈
第8行:定義變數m=1用於記錄當前值的數量
第9行:判斷x+1是否還在外觀數列內且索引x+1對應的值是否與x對應的值相等,若是,執行迴圈
第10-11行:迴圈中,數量m加一,索引x加一,進行下次迴圈
第12行:按照定義,給字串上加上當前數字的數量和以及次數字
第13行:索引x加一,進行下次迴圈
第14行:當索引x大於外觀數列長度時,結束迴圈並返回字串y

程式碼執行結果為:

#演算法講解

這裡用到了基礎演算法:遞迴,簡單講解下這個演算法:
什麼是遞迴
程式呼叫自身的程式設計技巧稱為遞迴
遞迴做為一種演算法在程式設計語言中廣泛應用。


遞迴演算法一般用於解決三類問題:
(1)資料的定義是按遞迴定義的。(Fibonacci函式)
(2)問題解法按遞迴演算法實現。
(3)資料的結構形式是按遞迴定義的。


遞迴函式特徵
必須有一個明確的結束條件;
每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少
相鄰兩次重複之間有緊密的聯絡,前一次要為後一次做準備(通常前一次的輸出就作為後一次的輸入)。
遞迴效率不高,遞迴層次過多會導致棧溢位(在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位)