【Leetcode_總結】38. 報數
阿新 • • 發佈:2018-12-16
Q:
報數序列是一個整數序列,按照其中的整數的順序進行報數,得到下一個數。其前五項如下:
1. 1
2. 11
3. 21
4. 1211
5. 111221
1
被讀作 "one 1"
("一個一"
) , 即 11
。11
被讀作 "two 1s"
("兩個一"
), 即 21
。21
被讀作 "one 2"
, "one 1"
("一個二"
, "一個一"
) , 即 1211
。
給定一個正整數 n(1 ≤ n ≤ 30),輸出報數序列的第 n 項。
注意:整數順序將表示為一個字串。
示例 1:
輸入: 1
輸出: "1"
示例 2:
輸入: 4
輸出: "1211"
思路:這個題目看了好久才明白,(⊙_⊙)?。。思路就是先把題目中算好的幾個數放到一個list裡面,如果目標值在這個範圍內,直接返回結果,如果不在,就算算吧,計算就是使用一個雙指標,統計一下數量,然後加上對應的幾個幾就好了,效率有些低,程式碼如下:
class Solution: def countAndSay(self, n): """ :type n: int :rtype: str """ res = ['1','11','21','1211','111221'] if n <=5: return res[n-1] for i in range(4,31): slow = 0 fast = 1 nums = '' count = 1 print(res[i]) while fast < len(res[i]): if res[i][slow] == res[i][fast]: count+=1 fast+=1 else: nums+=str(count)+str(res[i][slow]) slow = fast fast+=1 count = 1 nums+=str(count)+str(res[i][slow]) res.append(nums) print(res) if i== n-2 : return res[i+1]
放一個效率比較高的程式碼作為範本吧,其實思路是一樣的,為啥差了這麼多毫秒-_-|| 可能是往list裡面儲存消耗時間了
class Solution: def countAndSay(self, n): """ :type n: int :rtype: str """ res = '1' for _ in range(n - 1): cur = res[0] count = 0 temp = '' for i in res: if i == cur: count += 1 else: temp += str(count) + cur cur = i count = 1 temp += str(count) + cur res = temp return res
將原先的res刪除,換成一個temp = ''作為中間變數,程式碼如下:
class Solution:
def countAndSay(self, n):
"""
:type n: int
:rtype: str
"""
res = ['1','11','21','1211','111221']
if n <= 5:
return res[n-1]
nums = '111221'
for i in range(4, n):
temp = ""
slow = 0
fast = 1
count = 1
while fast < len(nums):
if nums[slow] == nums[fast]:
count+=1
fast+=1
else:
temp+=str(count)+str(nums[slow])
slow = fast
fast+=1
count = 1
temp+=str(count)+str(nums[slow])
nums = temp
return nums
效率稍有提升: