字典序排数

字典序相信大家都不会陌生,这是给字符串排序尤其是非数字的字符串排序的常用方法.在我之前的一篇博客如何求解字符串中字典序最大的子序列中就曾围绕着字典序问题解决过一个问题.这里我们的新问题是,给一个整数n,(n>0),试着打印出从1–n的所有数的字典序.
这个问题看似比较容易,实现起来可并不是这样,我昨天其实没有彻底弄懂,仓促写下博客,再加上最近python和java都在学,学杂了,代码没通过,不过好在没有通过让我今天能够静下心来仔细去考察算法的思想.
这个问题来自于我关注的一个公众号,工作日每天一个数据结构的问题,我平时加的公众号很多,但真正看下去的寥寥无几,还能跟着学到东西的怕是就那一个了.所以这里感谢作者的分享,标明出处,以示尊重.
https://mp.weixin.qq.com/s/ENvy_p2ucOFZb7KpAsXN1w)
作者指出,这个问题有两种解法,第一种是利用树的深度优先搜索,设计一个十叉树,每个结点的孩子从0到9,按照深度优先搜索(DFS)的原则,在对它做遍历的时候,每遍历到一次叶子结点,就会产生一个数,把这个数打印出来,结合二叉树的先序遍历,不失为一个不错的解决方案,本人也在力图实现这个事情,但最近事多,暂时先放下,留待下次补充.
我今天想说的是第二种方法,我不知道该怎么说,这个方法其实挺笨的,就是自己在纸上写出几个数的字典序排列,然后找到其中的规律,根据这个规律打印出一个按照字典序排列的数组.但是方法虽笨,规律也不见得好早.接下来我们就开始找规律.
我们这里直接令n=300,(最好是三位数,否则规律不那么容易发现),每15个字换一行打印出来,看看字典序排序的结果再说话(手写你是要累死我吗)
在这里插入图片描述观察一下上面这个图,可以有几个粗浅的发现.
首先,1和2之间插入了很多数,这些书都是以1为最高位,1后面首先跟着的就是10,然后是100,再然后就是自然顺序排列了,一直到109又发生了变化,109后面是11,11后面是110,110后面又开始正常递增排列了,直到119又开始变化…
我们由此注意到,对于一个数,首先便是对它添零,比如1,10,100,而停止添零的条件应该是1000大于我们的上限300了,这个时候停止添零,转而增1,如100,101,102,…当增加到这个数的个位数是9时,停止增1,转而添加一个跟它有关的一个二位数,比如109,11.
我们把这个逻辑梳理一下,遇

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值