zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Dll版本管理
    线程池ThreadPool
    关于sitemesh和freemark在struts2中的一些问题总结
    Google 怎么搜索
    android 设计模式
    android webview
    ios 基础数据类型
    android 常用
    android Handler vs Timer
    网站
  • 原文地址:https://www.cnblogs.com/MartinLwx/p/11521416.html
Copyright © 2011-2022 走看看