python_leetcode38. 报数

本文介绍了LeetCode中的一道题目——报数序列,讲解了如何根据给定的正整数n求解序列的第n项。通过分析示例和已有的解题思路,总结出规律:从上一层推算下一层,当数值不同时计数器为1,相邻数值相等时计数器加1,并以此生成下一层的序列。最后,引用了他人代码作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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"

 

思路:开始审题有些问题,没能理解,找了下答案:

           由上一层推下一层:例

           第四层推第五层:第四层为1211,从左至右读作:一个一,一个二,两个一   

                                                                         故写作==>11 12 21

           不难看出规律:

                                1.使用计数器计数初始值为1,上层每一个数,不相同记为1

                                2.如果相邻两值相等则计数器加一,记为2。如11下层记为两个一(21),22下层记为两个                                        二(22),而不是211和222.  

           然后遍历保存拼接。

参考自https://blog.youkuaiyun.com/weixin_41958153/article/details/80911011

 

def countAndSay( n):
    if n == 1:  
        return '1'
    if n == 2:
        return '11'
    # 进行i=3时的循环时,它的上一项为'11'
    pre = '11'

    # 用for循环不断去计算逼近最后一次
    for i in range(3, n + 1):
        res = ''  # 结果,每次报数都要初始化
        cnt = 1  # 计数变量

        length = len(pre)  # 遍历我们的上一项,所以记录它的长度
        for j in range(1, length):
            if pre[j - 1] == pre[j]:  # 相等则加一
                cnt += 1
            else:
                # 一旦遇到不同的变量,就更新结果
                res += str(cnt) + pre[j - 1]
                cnt = 1  # 重置为1
        # 把最后一项及它的数量加上
        res += str(cnt) + pre[j]
        pre = res  # 保存上一次的结果
    return res


别人代码:

class Solution(object):
    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        s = '1'
        for _ in range(1, n):
            nextS = ''
            countC = 1
            for i in range(1, len(s)+1):
                if i == len(s) or s[i] != s[i-1]:
                    nextS += str(countC) + s[i-1]
                    countC = 1
                else:
                    countC +=1
            s = nextS
        return s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值