LeetCode0038. 外观数列

一. 题目
  1. 题目
    在这里插入图片描述
  2. 示例
    在这里插入图片描述
二. 方法一: 递归
  1. 解题思路

    1. 递归方法
    2. 如果n = 1, 直接返回1
    3. 如果n > 1, 则计算出n - 1项结果
    4. 对结果进行遍历, 对相邻位置相同数字进行计数
    5. 然后拼接好的字符串即可
  2. 解题代码

    class Solution:
        # 递归函数, 貌似写在主函数里面会报错, 不清楚是不是LeetCode不允许主函数递归
        def countNum(self, n: int) -> str:
            # 默认每个元素计数为1
            num = 1
            result = ""
            # 如果n = 1, 则结果为1
            if n == 1:
                return "1"
            # 如果 n > 1, 则获取countNum(n - 1)的结果
            else:
                str1 = self.countNum(n - 1)
                for i in range(len(str1)):
                    # 遍历到末尾之前, 且当前下标元素和后一个下标元素相等
                    if i + 1 < len(str1) and str1[i] == str1[i + 1]:
                        # 计数 + 1
                        num += 1
                    # 如果遍历到末尾 或者 当前下标元素和后一个下标元素不相等
                    else:
                        # 将当前的值和当前的数量拼接成字符串
                        result += str(num) + str1[i]
                        num = 1
            return result
        def countAndSay(self, n: int) -> str:
            return self.countNum(n)
    
  3. 分析

三. 方法二:
  1. 解题思路
    解题思路和方法1差不多, 但是这里使用循环代替了递归
    用变量保存了上一次判断的结果

  2. 解题代码

    def countAndSay(self, n: int) -> str:
        # 第一项的结果为"1"
        preItem = '1'
        # 计算下一项
        for i in range(1, n):
            # 初始化
            # 将num赋值为1, 下一项设置为空字符串, ele指向前一项的第一个元素
            num = 1
            nextItem = ""
            ele = preItem[0]    
            # 遍历前一项的元素
            for j in range(1, len(preItem)):
                # 如果前一项和后一项的值相等, num + 1
                if ele == preItem[j]:
                    num += 1
                # 如果不相等, 进行字符串的拼接和num的初始化
                else:
                    # 将前一个元素的连续个数和值拼接成字符串
                    nextItem += str(num) + ele
                    # 将当前元素的值赋值给ele, 进行后续的比较
                    ele = preItem[j]
                    # 初始化num
                    num = 1
            # 拼接最后一项
            nextItem += str(num) + ele
            # 将后一项的值,赋值给前一项, 然后再循环
            preItem = nextItem
        return preItem
    
  3. 分析
    时间复杂度: O(n^2)
    空间复杂度: O(n^2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值