386字典序排数,学会用递归的思想

这篇博客探讨了一种使用递归解决数字排列问题的方法,特别是在处理如1, 10, 11, ..., 100等数字序列时,避免字典序导致的错误排序。作者提出利用链表和递归的思想,通过递归函数在每个数字后插入所有可能的下一位数字,以实现正确的排序。这种方法类似于桶排序,但更注重于数字的构造而非排序。
摘要由CSDN通过智能技术生成

刚拿到这个问题的时候,我想到的只是第一位字典序排序,所以我把第一位为1的数字按照从小到大的顺序排下去了,很明显这样是有问题的,下面举个例子:
1,10,11.。。。100,但是100应该是在10后面的,按照字典序的原则,0一样,这样的话单纯的迭代可能就解决不了这个问题了,因为每次在结果列表里面放入一个数之后,应该考虑比它位数多的数字里面有没有前几位和它一样的数。
想到这里我也想到了用链表来求解这个问题,因为链表在插入的时候只需要O(n)的复杂度,这个问题跟桶排序有点类似,但又有点不同,因为它不是排序,而是排数。
所以这题选用递归,因为递归这东西好用,比如我现在从10跳到了100,在100这里的递归结束之后还能再回到10,这就节省了后续搜索插入的时间。

class Solution:
    def lexicalOrder(self, n: int) -> List[int]:
        count = 0
        result = []
        def function(x,n):
            if x<=n:
                result.append(x)
                for i in range(x*10,x*10+10):
                    function(i,n)	#递归

        while(int(n/math.pow(10,count))>0):
            count+=1
        for j in range(1,10):
            function(j,n)
        return result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值