今天在刷LeetCode的时候遇见了一道题,题的要求是“给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。”开始以为是简单的输出,提交后发现与答案相差甚多,看评论后方了解按字典序是什么意

目录

一、何为字典序

二、解题步骤

1.1-n整数的字典序

2.算法

3.代码


一、何为字典序

字典序,顾名思义就知道是按照字典的顺序来排序,给你abcdefg你知道怎么排序,那12,48,68,122,45,1,25,6这些数字该怎么排序呢?是按照大小么?给你area,too,second又该如何排序呢?这就是字典序要做的。

字典序(dictionary order),又称 字母序(alphabetical order),原意是表示英文单词在字典中的先后顺序,在计算机领域中扩展成两个任意字符串的大小关系。

在字典中,单词是按照首字母在字母表中的顺序进行排列的,比如 alpha 在 beta 之前。而第一个字母相同时,会去比较两个单词的第二个字母在字母表中的顺序,比如 account 在 advanced 之前,以此类推。

在计算机领域中,这个字典序就不仅仅用来比较英文单词了,而是比较任意字符串。对于两个字符串,大小关系取决于两个字符串从左到右第一个不同字符的 ASCII 值的大小关系。比如ah1x小于ahb,而Z5小于a3。

在绝大多数语言中,都提供了比对字符串大小的功能,实际上比较的就是两个字符串的字典序。

二、解题步骤

1.1-n整数的字典序

既然知道了什么是字典序,那1-n之间的整数按照字典序该如何排列呢?

我们假设n=13;那么排序后的结果就是[1,10,11,12,13,2,3,4,5,6,7,8,9]。为什么这样排呢?首先1排在最前面是肯定没有问题的,那么根据字典序的排序规则,1开头的数字都要排在2,3,4,5等数字开的数字前面,1是一位数字,10是两位数,所以1后面是10,然后比较第二位,所以10后面是11,12,13。

2.算法

那么1-n之间的数该怎么用程序给他们排序呢。

我们来观察上面的排序,如果我们排序排到一个数字num了,那他的后一位应该是num*10,如果num*10<=n的话,比如n=100,那么就是1,10,100的顺序,可是如果这个数字大于n了呢,那分为两种情况,比如这个数字是99或者100或9也就是说num%10=9或者num+1>n了,那我们应该将num/10,为什么呢?因为这一位已经判断完了,比如11,12,13第二位判断完了那我们是不是回去,看第一位呢!另外一种情况就是num=17,18,45这种,不属于上一种情况,那直接+1就行了。


3.代码

int* lexicalOrder(int n, int* returnSize){int *ans=malloc(sizeof(int)*n);int num=1;for(int i=0;i<n;i++){ans[i]=num;if(num*10<=n){num*=10;}else{while(num%10==9||num+1>n){num/=10;}num++;}}*returnSize=n;return ans;
}

利用迭代的算法将1-n之间的整数按字典序输出

字典序及1-n之间的数按字典序排列相关推荐

  1. 背包问题 输出方案、输出字典序最小方案、可行方案数、最优方案总数

    原文地址:https://blog.csdn.net/ronaldo7_zyb/article/details/81069906 1. 要求输出方案: 以01背包为例 我们可以知到,01背包用一维数组 ...

  2. 编写程序,随机产生20个0到1之间的数,将这20个数写入文本文件中,要求每行5个数

    import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOEx ...

  3. 2022-01-15:中心对称数 III。 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看)。 写一个函数来计算范围在 [low, high] 之间中心对称数的个

    2022-01-15:中心对称数 III. 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看). 写一个函数来计算范围在 [low, high] 之间中心对称数的个 ...

  4. 1到n的数按字典序排序

    #coding:utf-8 ''' 输入:n,m 输出从 1 到 n 的数按 字典序 排序的低 m 个数 如输入:11 4 1 10 11 2 3 4 5 6 7 8 9 中的第四个数 输出: 2 ' ...

  5. 小学生除法检验,10道题,每小题10分,被除数和除数随机产生。被除数是20~200之间的数,除数是2~9之间的一位数。用户输入答案,计算机判卷,做对了加10分,做错了不允许重做,最后输出成绩;

    欢迎加qq群:453398542 学习讨论,会定期分享资料课程,解答问题. 1.         小学生除法检验,10道题,每小题10分,被除数和除数随机产生.被除数是20~200之间的数,除数是2~ ...

  6. 求出200到300之间的数,且满足条件:它们三个数字之积为42,三个数字之和为12

    目录 编程练习 任务 编程练习 编写一个程序,求出200到300之间的数,且满足条件:它们三个数字之积为42,三个数字之和为12. 任务 1.循环遍历200到300之间的整数 2.分别取出个位.十位和 ...

  7. 编写一个程序,求出200到300之间的数,且满足条件:它们三个数字之积为42,三个数字之和为12。

    package com.Demo;public class test12 {public static void main(String[] args) {/** 编写一个程序,求出200到300之间 ...

  8. 编写一个Java应用程序。用户从键盘输入一个1~99999之间的数,程序将判断这个数是几位数,并判断这个数是否是回文数。回文数是指将该数含有的数字逆序排列后得到的数和原数相同,例如12121、3223

    编写一个Java应用程序.用户从键盘输入一个1-99999之间的数,程序将判断这个数是几位数,并判断这个数是否是回文数.回文数是指将该数含有的数字逆序排列后得到的数和原数相同,例如12121.3223 ...

  9. java的Random类生成随机的double范围【0,1)Math.random()生成0到100之间的数【0-100)【1-100】

    使用Random生成随机的double,范围[0,1) double b = new Random().nextDouble(); 测试用例 public class TestRandom {publ ...

最新文章

  1. “神经网络”的逆袭:80年AI斗争史
  2. 运用Kubernetes进行分布式负载测试
  3. jstl自定义标签接口介绍
  4. c#4.0新特性之一: Dynamic Lookup (1)
  5. android下升级软件介绍
  6. Java 8 新特性:扩展注解(类型注解和重复注解)
  7. 为什么百度查到的ip地址和ipconfig查到的不同;详解公网Ip和私网ip; 网络分类ABC类;
  8. php密码怎么用md5,如何使用PHP使用MD5加密此密码?
  9. 把e.printStackTrace的堆栈信息打印在log.error()中
  10. invalid cookie header httpclient
  11. 取石子游戏,威佐夫博弈的推理
  12. vulhub nginx insecure-configuration
  13. ARM——开发工具—编译器
  14. Unity 实战项目 ☀️| Unity实现 天空盒 轮播系列切换
  15. 装配图中齿轮的画法_机械制图教程(8.2)装配图的规定画法和特殊画法
  16. 2017年4月历史文章汇总
  17. python3小项目——爬取招聘信息(智联招聘)
  18. 公园智慧路灯:上海曹杨公园智慧灯杆项目案例分享
  19. aws mongodb_在AWS上托管React flask mongodb Web应用程序第4部分
  20. Python 当中的list

热门文章

  1. java 小孩报数_N个小孩围成一圈1-3报数,报3出局
  2. 从标数法求最短路径数到杨辉三角的思考
  3. Ubuntu 无法连接上 cn.archive.ubuntu.com:80
  4. python 文字转图片支持emoji_求教 Python 如何将字符串转化为 emoji?
  5. English Learning - Day21 作业打卡 2022.12.27 周二
  6. 智能AI抢了元宇宙的风头?
  7. 定位猫显示连接服务器失败,定位猫为什么不能用了,该怎么解决?看这里解决。...
  8. 前端学习从入门到高级全程记录之45 (ajax---1)
  9. 数控车床操控维修实训系统
  10. 机床数控改造控制系统设计(微型计算机),大学生毕业论文:普通车床数控研究及改造设计...