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

news/2025/9/28 13:56:51/文章来源:https://www.cnblogs.com/wzzkaifa/p/19116518

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

文章目录

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

摘要

在日常开发中,我们有时会需要把一批数字 按字典序 排列,而不是常规的数值大小排序。比如文件名 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.mzph.cn/news/920706.shtml

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

相关文章

题解:AT_abc214_g [ABC214G] Three Permutations

题意:很简单了,不再赘述。 做法: 直接做很困难,考虑容斥,钦定若干个 \(i=x_i\) 或者 \(i=y_i\),然后如果钦定了 \(k\) 个,那么贡献是 \((n-k)!(-1)^k\)。 但是有个问题,我们不能无脑钦定,这些钦定条件间会有一…

通过velocity将增量发版的代码及文件生成生成一个linux shell文件(解放运维)

pom.xm <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId></dependency> resource/shell/release_cp.sh.vm发版失败回…

从企业级项目到普惠API:我如何将自研的人脸识别引擎打造成「识度AI」

我把做过的人脸识别项目,变成了一个赚钱的副业:识度AI的从0到1实战录 ​ 嘿,朋友们,我是菠菜啊,一个标准的Java后端开发者,日常与SpringBoot和MySQL打交道。和你们一样,我不仅对技术实现着迷,更对如何让技术产…

得帆AI aPaaS 1.0正式发布,低代码+AI关键特性等你探索

自2022年起,得帆开始了对AI战略的持续探索与研究,致力于开发AI相关的产品及其特性。2025年5月15日,在上海中心J酒店举行的得帆AI战略发布会上,得帆正式公布了最新的AI产品演进路线图和Roadmap。 在此次战略发布会上…

【Array】数组:多个值的集合

【Array】数组:多个值的集合在编程中,我们经常需要处理一组相关的数据。数组(Array) 就是用来存储多个值的容器,它让我们能够将相关的数据项组织在一起,进行批量操作和处理。 一、 什么是数组? 数组就像一个多格…

Go基础:文件与文件夹操控详解

Go基础:文件与文件夹操控详解2025-09-28 13:41 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importan…

【代码注释】给脚本加上说明

【代码注释】给脚本加上说明在开始学习变量和编程概念之前,我们先要掌握一个简单但极其重要的技巧——代码注释。注释就像是给代码加的"便签"或"说明书",它们不会影响程序的运行,但能让代码更容…

百度站长工具链接提交怎么运营自己的网站

所谓的大道至简就是说大道理&#xff08;基本原理&#xff0c;方法和规律&#xff09;是极其简单的&#xff0c;简单到一两句话就能说明白。所谓“真传一句话&#xff0c;假传万卷书”。这也许也是这本书只有一百多页的原因吧。 说实话&#xff0c;《大道至简》这部作品对现在有…

帮助向量机深度解析:从数学原理到工程实践的完整指南

帮助向量机深度解析:从数学原理到工程实践的完整指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

网站建设与研发公司建设网站策划书

目录 前言 国内外研究现状 自然场景文本检测任务面临的挑战 自然场景文本检测的研究现状

设计网站遇到的问题看片狂人

以下主要描述了&#xff1a; TFS源代码控制系统的基本场景如何把一个项目添加到源代码管理中如何与服务器同步如何做Check-In如何做分支与合并什么是上架与下架 我们知道工作项是项目管理的基本元素&#xff0c;但是一个项目的成功&#xff0c;光有工作项还是不够的。工作项说…

【Array】类型化数组:强类型集合的优势

【Array】类型化数组:强类型集合的优势在掌握了数组的基本操作后,我们需要深入理解类型化数组的概念。类型化数组为数组元素指定明确的数据类型,这在安全性、性能和代码可读性方面都有显著优势。 一、 什么是类型化…

2025节能报告咨询机构最新推荐榜单:帮项目方筛选高效节能方案服务机构

在全球可持续发展战略深入推进,国内各类项目对节能要求不断提高的当下,一份专业、精准的节能报告已成为项目顺利落地、实现长期效益的关键。然而,当前节能报告咨询机构数量众多,资质水平参差不齐,项目方在选择时往…

无锡网站制作高端织梦响应式网站模板

吴川华南区技术负责人概要很多用户反馈电脑经过使用一段时间后&#xff0c;在开机或运行的时候变得十分缓慢。本文将针对Win 10启动慢(Win 10开机慢)这一问题&#xff0c;来为大家分析其原因及解决方案。新买的电脑一般都运行顺畅&#xff0c;不过使用一段时间后&#xff0c;在…

网站建设 599网页制作免费的模板

1. 海塞矩阵 海塞矩阵是一个由多变量实值函数的所有二阶偏导数组成的方块矩阵。 一元函数就是二阶导,多元函数就是二阶偏导组成的矩阵。求向量函数最小值时可以使用,矩阵正定是最小值存在的充分条件。经济学中常常遇到求最优的问题,目标函数是多元非线性函数的极值问题,尚…

详细介绍:DBA | MySQL 数据库基础数据操作学习实践笔记

详细介绍:DBA | MySQL 数据库基础数据操作学习实践笔记2025-09-28 13:31 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; …

外卖网站开发能多少钱常见的网站结构类型

4.1 顺序结构 在任何编程语言中最常见的程序结构就是顺序结构。顺序结构就是程序从上到下一行行地执行&#xff0c;中间没有任何判断和跳转。 如果Python程序的多行代码之间没有任何流程控制&#xff0c;则程序总是从上往下依次执行&#xff0c;排在前面的代码先执行&#xf…

广州市公司网站建设品牌做电脑网站用什么软件有哪些方面

创建wilddog应用填写应用名称和应用ID就可以创建了。应用ID需要全网唯一创建成功之后就可以在控制面板看到应用了.1.引入SDK2.创建引用ref Wilddog("https://.wilddogio.com/")//将替换成申请的应用IDref Wilddog("https://fullstack-top-demo.wilddogio.com/…

Windows远程桌面出现CredSSP加密数据修正问题解决方案

问题现象: 解决方案:方案一:1、win+R打开运行窗口2、输入gpedit.msc命令,点击“确定”3、依次展开“计算机配置”->“管理模板”->“系统”->“凭据分配”设置名称: 加密数据库修正4、双击“加密数据库修…

河南微网站开发佛山网站推广经理

牙膏厂终于发布了入门级性价比最高的十代CPU&#xff0c;inte i3 10100F。10100F采用LGA1200芯片接口,四核八线程,主频3.6GHz&#xff0c;睿频可以到4.3Ghz。TDP功耗65w&#xff0c;支持双通道DDR4 2666内存。可以搭配H410或B460主板。首发价格为699元&#xff0c;性价比非常的…