字典序排数

简介: 🎈今天给大家带来的是算法练习,题目为"字典序排数"。

说在前面

🎈今天给大家带来的是算法练习,题目为"字典序排数"。

问题描述

给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。\
你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。\
示例 1:

输入:n = 13
输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]

示例 2:

输入:n = 2
输出:[1,2]

提示:

1 <= n <= 5 * 10^4

思路分析

什么是字典序

在数学中,字典或词典顺序(也称为词汇顺序,字典顺序,字母顺序或词典顺序)是基于字母顺序排列的单词按字母顺序排列的方法。 这种泛化主要在于定义有序完全有序集合(通常称为字母表)的元素的序列(通常称为计算机科学中的单词)的总顺序。\
对于数字1、2、3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是 54321。

算法设计

知道了什么是字典序之后,我们就可以开始来设计我们的程序了,如下图:
1650280064(1).jpg

我们期望的输出应该是这样的。
我们需要按顺序找出每一位置上的所有数字,如:

  • 第1个数字

我们需要先找出所有个位数为1的数字

  • 第2个数字

在个位数为1的数字中找出第二位数位0的数字
.
.
.

  • 第n个数字

在个位数为1且其他位数的数字都为0的数字
每一个位置上的数字都需要进行以上的循环步骤,这么一看我们可以使用递归的方法来进行解题,但是题目要求必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法,所以我们改用迭代循环的方式来解题,具体代码如下:

AC代码

function lexicalOrder(n: number): number[] {
  const res = [];
  let num = 1;
  for (let i = 0; i < n; i++) {
    res.push(num);
    if (num * 10 <= n) {
      num *= 10;
    } else {
      while (num + 1 > n || num % 10 == 9) num = Math.floor(num / 10);
      num++;
    }
  }
  return res;
}

说在后面

🎉这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
缓存 安全 搜索推荐
如何使用 Shodan 搜索引擎保姆级教程(附链接)
如何使用 Shodan 搜索引擎保姆级教程(附链接)
|
7月前
|
Kubernetes Ubuntu Linux
阿里云服务器使用centos还是ubuntu?
在选择阿里云服务器操作系统时,CentOS和Ubuntu各有优势。CentOS以企业级稳定性著称,适合数据库、ERP等长期稳定需求;而Ubuntu开发者友好,支持最新硬件与功能,更适合开发/测试环境及云计算场景。两者在阿里云上均有官方镜像支持,性能差异可忽略。无特殊需求时推荐Ubuntu 22.04 LTS,若需RHEL生态则选AlmaLinux。根据实际需求、团队技术栈及场景灵活决策,阿里云还支持更换系统盘降低试错成本。
|
Web App开发 开发框架 前端开发
移动端window.open跳转链接时,iOS没有反应的问题
【10月更文挑战第9天】在移动端使用 `window.open` 跳转链接时,iOS 可能无响应,原因是 iOS 的安全策略和弹出窗口阻止功能。解决方法包括:确保在用户交互后触发 `window.open`,将目标设置为 `_self`,使用锚点链接模拟跳转,或利用专门的移动端框架。需综合考虑这些方案以优化用户体验。
2120 61
|
5月前
|
XML 数据处理 数据安全/隐私保护
微信卡片生成器在线制作,微信xml链接代码,xml卡片生成器
这段代码实现了一个完整的数据处理程序,包含主程序、数据处理模块和工具模块。主程序负责启动和异常处理
|
11月前
|
人工智能 Java 测试技术
《鸿蒙Next集成第三方AI图形渲染库:开启图形技术新征程》
在鸿蒙Next中集成第三方AI图形渲染库可提升应用的图形处理能力和视觉效果。开发者需熟悉开发环境,明确需求并选择合适的渲染库(如OpenGL、Vulkan等),获取相关文件与文档。集成步骤包括导入库文件、配置权限与资源、初始化及调用库功能。随后进行系统适配、性能优化和兼容性处理,确保不同设备上的正常运行。最后通过功能、性能和兼容性测试,确保应用稳定性和用户体验。这一过程要求开发者全面掌握鸿蒙开发技术和第三方库的使用方法,推动图形技术领域的创新。
230 7
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
936 14
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
221 13
|
缓存 负载均衡 应用服务中间件
Nginx 代理管理器强势登场!轻松设置反向代理,为你的网络安全与高效护航,快来探索!
【8月更文挑战第23天】Nginx 代理管理器(NPM)是一款强大的工具,用于简化反向代理的设置流程。反向代理能隐藏后端服务器的真实IP,提升安全性,实现负载均衡与缓存等功能。用户需先安装Nginx 代理管理器,然后通过其Web界面添加代理主机,指定代理名称、协议类型、服务器地址及端口等信息。对于HTTPS协议,还需上传SSL证书/密钥。完成设置后,可通过浏览器测试反向代理是否正常工作。Nginx 代理管理器还支持高级特性,如负载均衡、缓存及访问控制等。
405 1