leetcode 38 报数

本文介绍了一个有趣的数列生成算法——报数序列,并提供了一个简洁的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”

分析

乍一看挺奇怪的
但其实就是看上一个字符串,有几个连续的数字几
比如第4个是1211
“1” 个连续的 “1”“1” 个连续的 “2”“2” 个连续的 “1”
将引号部分的数字合起来就是 111221
看懂题目在做就很简单了

代码

def countAndSay(self, n: int) -> str:
        ans = []
        for i in range(35):
            ans.append("")
        ans[1] = "1"
        ans[2] = "11"
        ans[3] = "21"
        for i in range(4, 31):
            thisone = ans[i - 1]
            conti = 1
            c = thisone[0]
            ne = ""

            for j in range(1, len(thisone)):
                if thisone[j] == c:
                    conti += 1
                    continue
                else:
                    ne = ne + str(conti) + c
                    c = thisone[j]
                    conti = 1
            ne = ne + str(conti) + c
            ans[i] = ne

        return ans[n]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值