更多精彩內(nèi)容,請關(guān)注【力扣簡單題】。
題目
難度:★★☆☆☆
類型:數(shù)組
報數(shù)序列是一個整數(shù)序列,按照其中的整數(shù)的順序進行報數(shù),得到下一個數(shù)。其前五項如下:
- 1
- 11
- 21
- 1211
- 111221
1 被讀作 "one 1" ("一個一") , 即 11。
11 被讀作 "two 1s" ("兩個一"), 即 21。
21 被讀作 "one 2", "one 1" ("一個二" , "一個一") , 即 1211。
給定一個正整數(shù) n(1 ≤ n ≤ 30),輸出報數(shù)序列的第 n 項。
注意:整數(shù)順序?qū)⒈硎緸橐粋€字符串。
示例
示例 1:
輸入: 1
輸出: "1"
示例 2:
輸入: 4
輸出: "1211"
解答
網(wǎng)上都只說從前一個推后一個,但是真的很難看懂,直接引CSDN某大佬的吧。
class Solution:
def countAndSay(self, n):
"""
:type n: int
:rtype: str
"""
if n == 1: # 類似于斐波拉契數(shù),后面的數(shù)跟前面的數(shù)有關(guān)
return '1'
if n == 2:
return '11'
# 進行i=3時的循環(huán)時,它的上一項為'11'
pre = '11'
# 用for循環(huán)不斷去計算逼近最后一次
for i in range(3, n + 1):
res = '' # 結(jié)果,每次報數(shù)都要初始化
cnt = 1 # 計數(shù)變量
length = len(pre) # 遍歷我們的上一項,所以記錄它的長度
for j in range(1, length):
if pre[j - 1] == pre[j]: # 相等則加一
cnt += 1
else:
# 一旦遇到不同的變量,就更新結(jié)果
res += str(cnt) + pre[j - 1]
cnt = 1 # 重置為1
# 把最后一項及它的數(shù)量加上
res += str(cnt) + pre[j]
pre = res # 保存上一次的結(jié)果
return res
如有疑問或建議,歡迎評論區(qū)留言~