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"

解答

网上都只说从前一个推后一个,但是真的很难看懂,直接引CSDN某大佬的吧。

class Solution:
    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        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

如有疑问或建议,欢迎评论区留言~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。