当前位置: 首页 > news >正文

LeetCode 386 字典序排数 Swift 题解:模拟字典翻页的遍历技巧 - 实践

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 代码拆解
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

在日常开发中,我们有时会需要把一批数字 按字典序 排列,而不是常规的数值大小排序。比如文件名 file1, file2, file10, file11,按照数值大小排应该是 1,2,10,11,但如果是字典序就会变成 1,10,11,2

这道题要求我们从 1n 的所有整数,按字典序输出,而且时间复杂度必须是 O(n),空间 O(1)。看起来像是一个遍历问题,但其实有点像在 翻字典页

描述

题目给定一个整数 n,要求输出 [1...n] 之间的所有整数,按字典序排列。

比如:

而且我们要在 O(n) 时间 + O(1) 空间 内完成,不能靠排序来做。

题解答案

最直观的想法可能是:

  1. 先生成 [1...n] 的数组。
  2. 转成字符串排序。

但是这样会需要 O(n log n) 时间,明显不符合要求。

题目的正确解法是 模拟字典树(Trie)的遍历顺序

  • 1 开始,把它当作前缀。
  • 每次尝试进入更深层(比如从 110)。
  • 如果无法深入,就回退到上一个兄弟(从 19 回退到 2)。

这种方法其实就是在用数字直接模拟字典序,而不是把它们真的转成字符串。

题解代码分析

Swift 代码如下:

import Foundation
class Solution {
func lexicalOrder(_ n: Int) -> [Int] {
var result: [Int] = []
var current = 1
for _ in 1...n {
result.append(current)
if current * 10 <= n {
// 优先进入更深层,比如 1 -> 10
current *= 10
} else if current % 10 != 9 && current + 1 <= n {
// 如果还能往右走,比如 1 -> 2
current += 1
} else {
// 回退到上一个父节点,比如 19 -> 2
while current % 10 == 9 || current + 1 > n {
current /= 10
}
current += 1
}
}
return result
}
}

代码拆解

  1. 起点:从 1 开始。
  2. 优先进入子节点:如果 current * 10 <= n,说明还能下钻,比如从 1 -> 10
  3. 进入兄弟节点:如果 current + 1 <= n,就往右,比如 1 -> 2
  4. 回退:如果到头了(比如 19),就往上回退,再加一。

这种方法就像在用数字模拟 DFS 遍历字典树。

示例测试及结果

我们写一个 Demo 来验证:

let solution = Solution()
let ex1 = 13
print("输入: \(ex1)")
print("输出: \(solution.lexicalOrder(ex1))\n")
let ex2 = 2
print("输入: \(ex2)")
print("输出: \(solution.lexicalOrder(ex2))\n")

运行结果:

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

完全符合题目要求。

时间复杂度

  • 我们只遍历了 1...n 的所有数字,每个数字都处理一次,所以是 O(n)
  • 没有额外的排序开销,效率很高。

空间复杂度

总结

这道题的精髓在于 不用排序,而是直接按字典序遍历数字

  • 它模拟的是一个“字典树遍历”的过程:优先下钻、其次右移、最后回退。
  • 这种技巧在实际中也很常见,比如分页系统里的编号排序、日志文件排序、甚至数据库里的字符串索引扫描。

对开发者来说,这个题的意义在于学会从 字典序的生成过程 来思考,而不是事后再去排序。

http://www.gsyq.cn/news/13445.html

相关文章:

  • 通过velocity将增量发版的代码及文件生成生成一个linux shell文件(解放运维)
  • 题解:AT_abc214_g [ABC214G] Three Permutations
  • 从企业级项目到普惠API:我如何将自研的人脸识别引擎打造成「识度AI」
  • 帮助向量机深度解析:从数学原理到工程实践的完整指南
  • 【Array】类型化数组:强类型集合的优势
  • 【安装红帽子 redhat Linux 9.0版本】教程
  • CentOS 10服务器版 部署Zabbix7.2 server端 - 教程
  • 完整教程:雪山飞狐之 Swift 6.2 并发秘典:@concurrent 的江湖往事
  • 数字孪生背后的通信协议:MQTT、OPC UA选型指南 - 指南
  • 深入解析:DIC技术在极端条件下的应用及解决方案
  • Nginx反向代理配置全流程实战:从环境搭建到HTTPS部署 - 详解
  • crewCTF 2025 -- WASM Vault
  • oppo-r9m线刷刷机教程
  • 【DateTime】日期时间:时间处理的基础
  • 完整教程:蒸汽机革命后工业生产方式的变革与AI智能名片S2B2C商城小程序的影响
  • 2025 PHP7/8 实战入门:15 天精通现代 Web 制作——第 15 课:项目实战与部署
  • 一个问题记录-服务器那边所以得请求进去,去操作数据库的时候,全部都拿不到数据库链接com.alibaba.druid.pool.GetConnectionTimeoutException
  • 稍微人格解离一点也无所谓,别太过就行
  • OI 模板合集
  • 非线性规划、最优控制与多目标优化
  • IDEA/WebStorm 卡顿困难与启动参数调优指南
  • python第三天
  • 全国主要城市温度舒适度榜:谁在天堂,谁在蒸笼
  • 【IEEE出版、曾获中国科协认证】第六届机械工程、智能制造与自动化技术国际学术会议 (MEMAT 2025)
  • 【2025-09-26】奋斗逻辑
  • Elasticsearch 7.15索引模板介绍 - 实践
  • python的批量赋值语法
  • 图领域的METIS算法介绍 - zhang
  • 【Double】浮点数:精确的小数计算
  • CANOpen safety SRDO相关问题总结