數數並說序列是乙個整數序列,第二項起每一項的值為對前一項的記數,其前五項如下: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輸...