386. 字典序排数

news/2025/11/2 11:33:23/文章来源:https://www.cnblogs.com/amulong1237/p/19184609

这个问题是经典的 "字典序排序"(Lexicographical Order)问题,要求按字典序输出 [1, n] 的数字,并且要求 O(n) 时间O(1) 额外空间(不包括输出占用的空间)。


思路分析

字典序比较规则:

  • 比较数字的字符串形式,例如 102 之前,因为 "10" < "2" 按字符串比较。

直接排序会超过 O(n) 时间,所以需要用 DFS 风格的生成方法 来按字典序遍历。

核心思想

  • 从 1 到 9 开始,对每个数字 curr
    • 先输出 curr
    • 然后递归地(或迭代地)处理 curr * 10curr * 10 + 9 的数字,只要它们 <= n
  • 这实际上是在遍历一个 十叉树 的先序遍历。

算法步骤(迭代 / 模拟 DFS)

我们可以用迭代来避免递归栈空间,实现 O(1) 额外空间(除了输出列表)。

  1. 初始化 curr = 1
  2. 循环直到处理完所有数字:
    • curr 加入结果
    • 如果 curr * 10 <= n,则进入下一层(更长的数字前缀)
    • 否则:
      • 如果 curr % 10 == 9curr + 1 > n,则回溯到上一层(curr = curr / 10
      • 否则 curr++
  3. 直到 curr == 1 且需要回溯时结束(实际可判断结果数量达到 n 个停止)

代码实现

/*** @param {number} n* @return {number[]}*/
var lexicalOrder = function(n) {const result = [];let curr = 1;for (let i = 0; i < n; i++) {result.push(curr);if (curr * 10 <= n) {// 进入下一层:curr -> curr * 10curr *= 10;} else {// 到达该层末尾或 n 的限制if (curr >= n) {curr = Math.floor(curr / 10);}curr += 1;// 跳过末尾0,直接进位while (curr % 10 === 0) {curr = Math.floor(curr / 10);}}}return result;
};

更清晰的迭代实现(推荐)

var lexicalOrder = function(n) {const result = [];let num = 1;for (let i = 0; i < n; i++) {result.push(num);if (num * 10 <= n) {num *= 10; // 深度优先:先走最左路径} else {// 回溯:如果到了末尾或超出 n,则回到上层if (num >= n) {num = Math.floor(num / 10);}num += 1;// 处理进位产生的末尾0while (num % 10 === 0) {num = Math.floor(num / 10);}}}return result;
};

示例

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

执行过程(简略):

  • 1 → 10 → 11 → 12 → 13 → 回溯到 1 → 2 → 3 ... → 9

复杂度分析

  • 时间复杂度:O(n),每个数字恰好处理一次。
  • 空间复杂度:O(1) 额外空间(不包括存储结果的数组)。

好的,我来详细解释 DFS 风格的生成方法 来解决字典序排序问题。

核心思想

把数字 1~n 看作一个 十叉树

  • 根节点是空字符串
  • 每个节点的子节点是在末尾添加 0~9
  • 先序遍历 这棵树,就得到字典序

例如 n=20:

        (root)/  |  \1   2   3...9/|\10 11 12...19/100... (但>20,停止)

DFS 递归实现

var lexicalOrder = function(n) {const result = [];function dfs(current) {if (current > n) return;if (current > 0) {result.push(current);}// 对当前数字,尝试添加 0~9for (let i = 0; i <= 9; i++) {if (current === 0 && i === 0) continue; // 避免 "0"const next = current * 10 + i;if (next > n) break; // 提前终止dfs(next);}}dfs(0); // 从0开始,但跳过0本身return result;
};

问题:递归会使用 O(log n) 的栈空间,不完全符合 O(1) 空间要求。


迭代 DFS(O(1) 空间)

模拟 DFS 的栈行为,但不实际用栈:

var lexicalOrder = function(n) {const result = [];let curr = 1;for (let i = 0; i < n; i++) {result.push(curr);if (curr * 10 <= n) {// DFS 深入:往左子树走 (curr * 10)curr *= 10;} else {// 到达当前分支末尾,需要回溯if (curr >= n) {curr = Math.floor(curr / 10);}curr += 1;// 跳过末尾的0,比如 19 -> 20 应该变成 2while (curr % 10 === 0) {curr = Math.floor(curr / 10);}}}return result;
};

DFS 遍历的直观理解

以 n=13 为例,DFS 遍历路径:

1 → 10 → 11 → 12 → 13 → 回溯 → 2 → 3 → 4 → ... → 9

DFS 规则

  1. 如果能 ×10 还在 n 内,就 ×10(往深层走)
  2. 否则 +1(同层下一个)
  3. 如果 +1 后超过 n 或进位了,就回溯到上层

带详细注释的版本

var lexicalOrder = function(n) {const result = [];let num = 1;for (let i = 0; i < n; i++) {result.push(num);// 1. 优先往深层走:num -> num*10if (num * 10 <= n) {num *= 10;} else {// 2. 当前层遍历完毕或超出n,需要调整if (num >= n) {// 如果当前数已经>=n,回溯到上一层num = Math.floor(num / 10);}num += 1;// 3. 处理进位:比如 199 -> 200 应该变成 2while (num % 10 === 0) {num = Math.floor(num / 10);}}}return result;
};

为什么这是 DFS?

  • 深度优先:总是先尝试在当前数字后面加 0(×10),进入更"深"的数字
  • 回溯:当不能再加深时(×10 > n),回到上一层继续
  • 这正好对应树的 先序遍历:根 → 左子树 → 右子树

复杂度分析

  • 时间:O(n) - 每个数字恰好输出一次
  • 空间:O(1) - 只用了几个变量

这种方法完美满足了题目的要求,既高效又节省空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/953455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月网站建设公司推荐:央国企与博物馆共同选择的十家

2025年11月网站建设公司推荐:年度十强榜单与选型指南 (一)开篇引言 行业背景与痛点 中国互联网络信息中心CNNIC发布的第54次《中国互联网络发展状况统计报告》显示,截至2025年6月,全国企业网站总量已突破650万个,…

2025年11月中国员工福利公司榜:十家主流平台对比解析

临近年末,预算关账、年会筹备、春节福利方案提上日程,HR和行政部常被“众口难调、合规审计、发票归集”三座大山压得喘不过气。尤其大型国企、上市公司、政企机关,既要符合财政部福利费新规,又要满足员工对商品丰富…

2025年11月背单词软件推荐评测:宠光单词宝宝等五款工具深度解析

背单词常被视作语言学习最枯燥的环节,却也是提分、升职、留学、考研、考证的必经之路。2025年第三方教育数据平台EduInsight抽样显示,超过73%的成人学习者把“记不住、记不牢、没时间复习”列为三大痛点;同一调研中…

2025年11月亲子旅游景区推荐:热门榜对比指南

2025年11月,秋末冬初,正是带娃错峰出游的黄金窗口。机票酒店价格回落,景区人流减少,家长希望用一次“不赶行程、不挤人流”的度假,把自然课堂、亲子互动和放松疗愈一次打包。后台高频提问集中在:有没有“不用做攻…

2025年11月背单词软件评测榜:从自定义词库到数据留存全维度对比

十一月是考研冲刺、留学申请、职称英语考试叠加的“词汇高需期”,很多用户把“背单词软件”加入购物车,却陷入“功能雷同、广告过多、数据丢失”三大痛点:有人需要把专业文献生词一键导入,有人希望利用通勤碎片时间…

2025年11月亲子旅游景区评测榜:十强真实表现与家庭出游决策指南

立冬后的东北已飘起新雪,不少家长把年假锁定在十一月:人少、机票跌、雪景初成,正是带娃看雪、泡温泉、做自然观察的窗口期。教育部《2024研学旅行白皮书》显示,冰雪自然类景区在11月亲子订单占比同比提升18%,其中…

2025 年 11 月污水处理厂生物除臭设备,餐厨垃圾生物除臭设备,垃圾中转站生物除臭设备厂家最新推荐,聚焦跨平台能力与售后体系的实用指南

污水处理厂、餐厨垃圾处理场、垃圾中转站三类场景的臭气治理场景差异大,对生物除臭设备的跨平台适配能力要求极高,同时完善的售后体系是设备长期稳定运行的关键。但部分厂家设备仅适配单一场景,且售后响应滞后,影响…

关于码代码的编辑器和字体 sublime text 和 JetBrains Maple Mono

关于码代码的编辑器和字体 sublime text 和 JetBrains Maple Mono用来用去,还是sublime text便于码代码,耐看,基本编辑功能也够用。 某些方便性是不如notepad++,但是那个可以临时启动notepad++作为互补,补充。 VS…

CTFHub 命令注入-综合练习 WP

CTFHub 命令注入-综合练习 WP <?php $res = FALSE;if (isset($_GET[ip]) && $_GET[ip]) {$ip = $_GET[ip];$m = [];if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {$c…

C++语法—类的继承

一、继承 继承方式有三种,public、private、protected 不管是什么继承方式,父类中的私有属性都无法直接访问,只能通过get、set访问 使用public继承,那么父类中的public、private、protected在子类中维持原来的修饰…

2025 年 11 月印染厂污水生物除臭设备,污水站生物除臭设备,屠宰场生物除臭设备厂家最新推荐,聚焦高端定制需求与全案交付能力

印染厂污水、污水站、屠宰场的臭气成分复杂且工况差异大,对生物除臭设备的高端定制与全案交付能力要求极高。但部分厂家仅提供标准化设备,无法满足个性化需求,且交付环节缺乏统筹,影响项目落地效率。本次推荐基于行…

2025 年 11 月污水处理厂生物除臭设备,污水泵站生物除臭设备,厨余垃圾生物除臭设备厂家最新推荐,高性能与可靠性兼具的优质品牌

污水处理厂、污水泵站、厨余垃圾处理场景的臭气治理,对生物除臭设备的性能与可靠性要求极高。但当前市场部分设备存在除臭效率低、故障频发等问题,影响企业治理效果。本次推荐基于行业协会专项测评,测评以 “高性能…

2025年11月超声波清洗机厂家榜单:性能与口碑双轨对比

年底临近,生产线集中检修、实验室设备升级、精密加工订单加急,超声波清洗机成为众多工厂、医院、高校实验室的“刚需”。用户普遍面临三大痛点:一是清洗效果能否通过客户或监管方的颗粒度检测;二是设备寿命与售后响…

2025 年 11 月印染厂污水生物除臭设备,食品厂污水生物除臭设备,屠宰场生物除臭设备厂家最新推荐,实力品牌深度解析采购无忧之选!

印染厂污水、食品厂污水、屠宰场等场景因污染物成分复杂,臭气治理难度大,对应的生物除臭设备选择尤为关键。但当前市场品牌良莠不齐,企业常面临设备适配性差、售后无保障等问题。本次推荐基于行业协会最新测评数据,…

2025年11月超声波清洗机厂家排行:五家主流品牌深度评测

把设备交给产线之前,采购经理最常问的三句话是:能不能洗得干净、会不会洗坏零件、后续维护麻不麻烦。这三句背后,其实是同一件事——如何在预算、产能、工艺标准之间找到那条“刚好”的线。2025年,超声波清洗行业继…

2257. 统计网格图中没有被保卫的格子数

给你两个整数 m 和 n 表示一个下标从 0 开始的 m x n 网格图。同时给你两个二维整数数组 guards 和 walls ,其中 guards[i] = [rowi, coli] 且 walls[j] = [rowj, colj] ,分别表示第 i 个警卫和第 j 座墙所在的位置。…

2025年11月白茶品牌榜单:北路领衔五强横向评测

立冬将至,不少茶友开始为一年一度“封箱藏茶”做准备:有人想囤点甘甜的老寿眉,煮着喝更暖胃;有人计划挑几饼年份银针,送礼体面又保值;也有人刚入坑,只想先买几泡试饮装,把白茶的毫香、枣香、药香一次性体验清楚…

在UOS中浏览NAS图片

一、启用远程环境的预览图功能 UOS的文件管理器对本地文件默认开启预览图功能,但对NAS等远程目录,考虑加载速度和操作流畅性,默认关闭该功能,需要手动开启,步骤如下:打开文件管理器的设置选项在左侧边栏找到“工…

未来编程

接上篇【AI时代下普通小程序员的想法】。人类编程的发展呈现出几个明显趋势: 一、编程更易学易用 例如:C → Java → AI,语言和工具不断朝着降低学习与使用门槛的方向演进。 二、代码耦合度不断降低(decouple) 目…

基于MATLAB与Zemax动态数据交换(DDE)工具箱

一、DDE通信原理架构二、核心工具箱功能 Zemax DDE Toolbox 提供以下关键功能模块:连接管理 zDDEInit:初始化DDE会话 zDDEClose:终止通信连接 zSetTimeout:设置超时阈值(默认3秒) 数据交互 zLoadFile:加载ZMX文…