1. 程式人生 > >LeetCode 38 報數 --python3

LeetCode 38 報數 --python3

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

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"

解析:

1 ->讀作 1個1 即 11 

11 ->讀作 2個1 即 21

21 ->讀作 1個2 ,1個1 即 1211

1211 ->讀作 1個1,1個2,2個1 即 111221

111221 ->讀作 3個1,2個2,1個1 即 312211

class Solution:
    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        def read(lst):
            """
            讀取字串的函式,返回值為讀取的字串
            :type lst: str
            """
            st =""
            j = 1
            for i in range(1,len(lst)):
                if i<len(lst)-1 and lst[i] == lst[i-1]:
                    j += 1
                elif i == len(lst)-1 and lst[i] == lst[i-1]:
                    j += 1
                    st = st + str(j) + lst[i-1]
                    return st
                elif i == len(lst)-1 and lst[i] != lst[i-1]:
                    st = st + str(j) + lst[i-1] + str(1) + lst[i]
                    return st
                else:
                    st = st + str(j) + lst[i-1]
                    j = 1  
            return st
        if n==1:
            return "1"
       ###此處n==2,因為read函式lst中至少存在兩個元素
        elif n==2:
            return "11"
        else:
            ll ="11"
            num = 3
            while num <= n:
                ll = read(ll)
                num += 1
            return ll