1. 程式人生 > >【Leetcode_總結】38. 報數

【Leetcode_總結】38. 報數

Q:

報數序列是一個整數序列,按照其中的整數的順序進行報數,得到下一個數。其前五項如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 被讀作  "one 1"  ("一個一") , 即 1111 被讀作 "two 1s" ("兩個一"), 即 2121 被讀作 "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

 效率稍有提升: