Leetcode 38.报数 By Python

报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

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"

思路

  • 手动模拟报数的过程,逐步递推就好了
  • 一个很妙的解法是利用itertoolsgroupby方法,会自动帮我们完成数数的过程,用法距离如下:
[k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
[list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

Code

from itertools import groupby
class Solution:
    def countAndSay(self, n: int) -> str:
        prev = '1'
        
        for i in range(1,n):    # 计算n-1次
            cnt = 0
            tmp = ''
            pos_char = prev[0]
            length = len(prev)
            for j in range(length):    # 数数的过程
                if prev[j] != pos_char:
                    tmp += str(cnt) + pos_char
                    cnt = 1
                    pos_char = prev[j]
                else:
                    cnt += 1
            tmp += str(cnt) + pos_char
            prev = tmp       # 完成一次更新
        return prev
    
    
# 利用了itertools的解法
from itertools import groupby
class Solution:
    def countAndSay(self, n: int) -> str:
        prev = '1'
        for i in range(1,n):
            prev = ''.join([str(len(list(g))) + k for k,g in groupby(prev)])
        return prev

注明

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-and-say

猜你喜欢

转载自www.cnblogs.com/MartinLwx/p/11521416.html