440. 字典序的第K小数字 : 计数模拟运用题

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 440. 字典序的第K小数字 : 计数模拟运用题

网络异常,图片无法展示
|


题目描述



这是 LeetCode 上的 440. 字典序的第K小数字 ,难度为 困难


Tag : 「数学」、「模拟」、「找规律」、「计数」


给定整数 nnkk,返回  [1, n][1,n] 中字典序第 kk 小的数字。


示例 1:


输入: n = 13, k = 2
输出: 10
解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。
复制代码


示例 2:


输入: n = 1, k = 1
输出: 1
复制代码


提示:


  • 1 <= k <= n <= 10^91<=k<=n<=109


计数模拟



寻找字典序第 kk 小的数。


我们可以将该过程分两步操作 :「确定前缀」和「从以某个前缀开始找目标值」。


假定我们存在某个函数 int getCnt(int x, int limit),该函数实现了统计范围 [1, limit][1,limit] 内以 xx 为前缀的数的个数。


有了该函数之后,我们可以从最小的前缀 11 开始枚举,假设当前枚举到前缀 xx,根据 cnt = getCnt(x, n)cnt=getCnt(x,n)kk 的大小关系进行分情况讨论:


  • cnt < kcnt<k:说明所有以 xx 为前缀的数组均可跳过,此时让 xx 自增,kk 减去 cntcnt。含义为从下一个「数值比 xx 大」的前缀中找目标值;
  • cnt \geqslant kcntk:说明目标值前缀必然为 xx,此时我们需要在以 xx 为前缀的前提下找目标值。此时让 xx1010kk11(代表跳过了 xx 本身)。含义为从下一个「字典序比 xx 大」的前缀中找目标值。


k = 1k=1 时,当前前缀 xx 即是答案(含义为以 xx 为前缀的所有数中,最小的数,也就是 xx 本身)。


然后重点看看 int getCnt(int x, int limit) 函数如何实现。


为了方便,记 xx 的位数为 nnlimitlimit 位数为 mm


根据 getCnt 的函数定义,在范围 [1, limit][1,limit] 内,以 xx 为前缀的数值数量等于下面所有情况的数量之和:


  • 位数为 nn 的数:仅有 xx 本身,共 11 个;
  • 位数为 n + 1 < mn+1<m 的数,有 x0x9,共 1010 个;
  • 位数为 n + 2 < mn+2<m 的数,有 x00x99,共 100100 个;
  • ...
  • 位数为mm的数,此时根据「limitlimit长度与xx等同的前缀uu」和「xx」的大小关系,进一步分情况讨论(举个 🌰,当limit = 12456limit=12456xx123123时,u = 124u=124,两者位数相差k = 2k=2位):
  • u < xu<x:此时所有位数为 mm 的数均大于 limitlimit,合法个数为 00
  • u == xu==x:此时所有位数为 mm 的数中部分满足 limitlimit 限制,合法个数为 limit - x * 10^k + 1limitx10k+1 个;
  • u > xu>x:此时所有位数为 mm 的数均小于 limitlimit,合法个数为 10^k10k


代码:


class Solution {
    public int findKthNumber(int n, int k) {
        int ans = 1;
        while (k > 1) {
            int cnt = getCnt(ans, n);
            if (cnt < k) {
                k -= cnt; ans++;
            } else {
                k--; ans *= 10;
            }
        }
        return ans;
    }
    int getCnt(int x, int limit) {
        String a = String.valueOf(x), b = String.valueOf(limit);
        int n = a.length(), m = b.length(), k = m - n;
        int ans = 0, u = Integer.parseInt(b.substring(0, n));
        for (int i = 0; i < k; i++) ans += Math.pow(10, i);
        if (u > x) ans += Math.pow(10, k);
        else if (u == x) ans += limit - x * Math.pow(10, k) + 1;
        return ans;
    }
}
复制代码


  • 时间复杂度:枚举前缀以及 getCnt 操作均与位数相关,复杂度均为 O(\log{n})O(logn)。整体复杂度为 O(\log{^2}{n})O(log2n)
  • 空间复杂度:忽略子串生成复杂度为 O(1)O(1),否则为 O(\log{^2}{n})O(log2n)


最后



这是我们「刷穿 LeetCode」系列文章的第 No.440 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。


在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。


为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:github.com/SharingSour…


在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

相关文章
|
域名解析 JSON 测试技术
常见移动端APP测试场景
常见移动端APP测试场景
490 0
|
4月前
|
安全 Java 编译器
【泛型】泛型:泛型擦除、通配符、上下界限定
Java泛型通过类型参数实现代码复用与编译期类型安全。其核心是**类型擦除**(运行时泛型信息被擦除,兼容旧JVM),配合**通配符**(`?`、`? extends T`、`? super T`)解决类型不变性问题,并依**上下界限定**约束类型范围。遵循PECS原则(生产者用extends,消费者用super),兼顾安全与灵活。
|
3月前
|
数据可视化 机器人 Windows
Adams 2024安装与模型库配置教程 Windows版:License配置+自定义路径+27500端口指南
Adams 2024 是集建模、求解与可视化于一体的多体动力学仿真平台,支持机械、机电、流体等多领域系统级仿真,广泛应用于汽车、航天与机器人等领域。(239字)
|
4月前
|
Java 测试技术 数据库
Java 全链路测试体系:单元测试、集成测试与 TDD 从原理到落地
本文系统讲解Java测试体系,涵盖测试金字塔模型、单元测试(FIRST原则、JUnit5/Mockito/AssertJ实战)、集成测试(TestContainers真实环境)、TDD红-绿-重构实践,以及覆盖率认知、CI/CD集成等落地准则,助力开发者构建高质可维护代码。
527 1
|
3月前
|
人工智能 安全 机器人
阿里云JVS Claw:三分钟实现“养虾自由”,下载就能用,免安装的OpenClaw
阿里云推出JVS Claw——零代码AI智能体平台:https://t.aliyun.com/U/IJbaxg 三分钟手机“养虾”,24小时待命、越用越聪明。支持多端同步、云端沙箱安全隔离、自进化技能体系。现启动“创意技能大赏”征集活动,邀全民共建智能体生态!
546 3
|
7月前
|
存储 消息中间件 Apache
ZooKeeper 实战指南:从入门到场景解析
Apache ZooKeeper是分布式系统的协调核心,本文带你快速搭建环境,掌握Znode操作与Watcher机制,深入理解其在分布式锁、配置管理、服务发现等场景的应用,并解析美团Leaf中的实践案例。
1321 206
|
4月前
|
JavaScript 芯片
三节串联锂电池充电芯片应用与PCB设计指南
PW4053A(异步)是一款5V输入,最大1.2A充电电流(是指电池端的电流,输出12.6V电池端的电压),支持三节锂电池的升压充电管理IC。PW4053A集成功率MOS采用异步开关架构,使其在应用时仅需极少的外围器件,可有效减少整体方案尺寸,降低BOM成本。PW4053A的升压开关充电转换器的工作频率为500KHz,转换率微90%。PW4053A啊呼入电压为5V,内置自适应环路,可智能调节充电电流大小,防止拉垮适配器输出,可匹配所有适配器。PW4053A提供SOP8-EP封装形式,工作温度额定范围为-40℃至85℃。
|
11月前
|
传感器 机器学习/深度学习 Oracle
2025如何通过智能物资管理工具实现降本增效?核心功能实现路径!
本文探讨了基于物联网与决策科学的现代物资管理系统架构,分析了物资管理工具从静态台账向智能中枢演进的技术路径。通过“感知-决策-执行”三层架构、多模态感知与自适应预测等关键技术,实现库存优化与智能调度。结合主流工具选型与实施策略,揭示物资管理向自感知、自优化方向发展的未来趋势。
522 0
|
传感器 人工智能 监控
通义灵码智能体模式在企业级开发中的应用:以云效DevOps自动化流程为例
通义灵码智能体模式具备语义理解、任务闭环与环境感知能力,结合云效DevOps实现CI/CD异常修复、测试覆盖与配置合规检查,大幅提升研发效率与质量。
535 0