Leetcode演算法 38 數數並說

2021-08-31 20:59:14 字數 1329 閱讀 3282

數數並說序列是乙個整數序列,第二項起每一項的值為對前一項的記數,其前五項如下:111

211211

111221

1 讀作 「1個1」,即 11

11 讀作 「兩個1」,即 21

21 讀作 「乙個2,乙個1」,即 1211

給定乙個整數n,1 ≤ n ≤ 30,生成數數並說序列的第 n 項。

備註:該整數序列的每一項都輸出為字串。

示例:example 1:

input: 1

output: 「1」

example 2:

input: 4

output: 「1211」

由於第 n 項的值,總是由第 n-1 項來決定的,因此可以使用遞迴法求解第 n-1 項的值,我們需要關心的,就是如何從第 n-1 項得到第 n 項。

根據序列的定義,需要對輸入的序列從左到右進行數數,規則為:

1、如果相鄰的數不同,則記為「1個x」

2、如果相鄰的數相同,則繼續向後遍歷,直至出現了不同的數,那麼前面這些相同的數作為乙個整體記為「m個x」

3、迴圈遍歷,直至遍歷到最後一位。

這樣,我們就知道了如何從第 n-1 項獲取到第 n 項。

遞迴法還需要規定遞迴結束條件:n=1時,序列的第一項的值規定為 1。

def

countandsay

(n):

""" :type n: int

:rtype: str

遞迴法。

"""# 遞迴結束條件

if n ==1:

return

"1"# 遞迴獲得前一項

# 末尾加上哨兵值,保證輸出所有記數

pre = countandsay(n-1)

+'.'

# 開始遍歷

tmp = pre[0]

count =

1 result =

''for i in

range(1

,len

(pre)):

if pre[i]

== tmp:

# 與前一項相同

count +=

1else

:# 與前一項不同,則輸出

result +=

str(count)

+ tmp

tmp = pre[i]

count =

1return result

if'__main__'

== __name__:

n =5print

(countandsay(n)

)

leetcode演算法練習 38 外觀數列

雜記 stringbuilder 所有題目源 git位址 題目 外觀數列 是乙個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。前五項如下 1.1 2.11 3.21 4.1211 5.111221 1 被讀作 one 1 乙個一 即 11。11 被讀作 two 1s 兩個一 即 21...

LeetCode 數數並說

github 數數並說序列是乙個整數序列,第二項起每一項的值為對前一項的計數,其前五項如下 1.1 2.11 3.21 4.1211 5.111221 6.312211 7.13112221 8.1113213211 9.31131211131221 10.132113111231131122111...

LeetCode 數數並說

1.1 2.11 3.21 4.1211 5.1112211被讀作 one 1 乙個一 即11。11被讀作 two 1s 兩個一 即21。21被讀作 one 2 one 1 乙個二 乙個一 即1211。給定乙個正整數 n 輸出報數序列的第 n 項。注意 整數順序將表示為乙個字串。示例 1 輸入 1輸...