leetcode报数序列,44ms,超越98%的用户

leetcode初级算法:报数序列,用时44ms,超越98%的用户。

解题思想:
  • 因为第n项结果是基于n-1项的,所以先用一个列表list_data存放所有的结果
  • 题目的特点是把n-1项的结果读出来(数字个数+数字),形成字符串,作为第n项的结果,那么就用count记录数字个数,把数字放入list_stack中
  • 当有一个新数字时,先判断新数字与list_stack[-1]是否相同,如果相同,count+=1,如果不同,将count+数字组成字符串,累加到结果result中
  • 按照这种逻辑,依次遍历n-1项的结果,遍历结束后,取出list_stack中的最后一项数字和对应的count,累加到result中,得到n项的结果
  • 出于方便按照索引取值,list_data=[‘0’,‘1’],0是拿来占一个索引位置的
  • 值得注意的是,当list_stack为空时,表示还没有向列表中添加数据,即还没有对n-1项结果进行遍历,此时应该直接将数字加入list_data中
  • 每次完成内部循环时,即遍历完了n-1项结果,都需要重置结果和其他的容器
代码如下
class Solution:
    def countAndSay(self, n: int) -> str:
        list_data = ['0','1']
        if n == 1:
            return '1'
        for i in range(2,n+1):
            list_stack = []
            count = 0
            data = list_data[i-1]
            result = ''
            for j in data:
                if len(list_stack) == 0:
                    list_stack.append(j)
                    count+=1
                elif list_stack[-1] == j:
                    count+=1
                elif list_stack[-1] != j:
                    temp = str(count)+list_stack[-1]
                    result+=temp
                    del list_stack[-1]
                    list_stack.append(j)
                    count=1
            temp = str(count)+list_stack[-1]
            result+=temp
            list_data.append(result)
        return list_data[n]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值