38. 報數(python)

揮揮灑灑發表於2018-12-06

題目描述(簡單)

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

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表示報數的集合,i 表示從1 到 n 的報數。單獨寫了一個求下一個報數結果的方法:nextseq,用res表示要返回的報數。

遍歷List[i-1]每一個字元,如果當前字元與下一個字元相等,count+1; 不等的話,res新增當前字元。要注意遍歷到最後一個字元的情況特殊處理。

程式碼

本次提交在python3中擊敗73.07%使用者

class Solution:
    def nextseq(self, seq):
        if len(seq) == 1:
            return '1' + seq
        res = ''
        count = 1
        for i in range(len(seq) - 1):
            if seq[i] == seq[i + 1]:
                count += 1
            else:
                res = res + str(count) + seq[i]
                count = 1
            if i ==len(seq)-2:#判斷是否到達最後一個
                res = res + str(count) + seq[i+1]
        return res

    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        List = []
        List.append('1')
        for i in range(1, n):
            cur = self.nextseq(List[i - 1])
            List.append(cur)
        return List[n - 1]

 

相關文章