news 2026/10/24 2:24:25

DeepSeek LeetCode 400. 第 N 位数字 Java实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek LeetCode 400. 第 N 位数字 Java实现

LeetCode 400. 第 N 位数字

题目描述

给你一个整数 n,请你在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, … 中找出并返回第 n 位上的数字。

示例:n = 11,序列为 1 2 3 4 5 6 7 8 9 1 0 1 1 …,第 11 位是 0。


思路:按位数分组定位

把序列按数字位数分层:

层 数字范围 数字个数 该层总位数
1 位 1 ~ 9 9 9
2 位 10 ~ 99 90 180
3 位 100 ~ 999 900 2700
4 位 1000 ~ 9999 9000 36000
… … 9 × 10^(d-1) 9 × 10^(d-1) × d

步骤:

  1. 从 d = 1 开始,逐层减去总位数 9 × 10^(d-1) × d,直到 n 落进当前层。
  2. 此时 n 表示在当前层(d 位数)中的第 n 位(从 1 开始)。
  3. 当前层的起始数字是 start = 10^(d-1)。
  4. 第 n 位所在的数字:num = start + (n - 1) / d。
  5. 该数字中的第几位(从高位起,0 开始):idx = (n - 1) % d。
  6. 答案即 num 的第 idx 位数字。

Java 实现

classSolution{publicintfindNthDigit(intn){// d:当前层的位数;start:当前层最小的 d 位数;count:当前层数字个数longd=1;longstart=1;longcount=9;// 逐层跳过,直到 n 落在当前层while(n>d*count){n-=d*count;// 减去当前层占用的位数d++;start*=10;count*=10;}// 现在 n 是当前层(d 位数)中的第 n 位(1-indexed)// 定位到具体数字longnum=start+(n-1)/d;// 定位到该数字中的具体位(从高位开始,0-indexed)intidx=(int)((n-1)%d);// 取 num 的第 idx 位// 例如 num = 1234, d = 4, idx = 0 → 要取最高位// (num / 10^(d-1-idx)) % 10return(int)(num/(long)Math.pow(10,d-1-idx)%10);}}

关键点说明

  1. 为什么用 long?

n 最大可达 2^31 - 1(约 21 亿),d * count 在处理较大 d 时可能接近甚至超过 int 上限(如 d = 9 时 9 × 10^8 × 9 ≈ 8.1×10^9),用 long 保存 d、start、count 可避免溢出。

  1. 取位运算

假设 num = 1234,d = 4:

· idx = 0(最高位 1):1234 / 10^3 % 10 = 1
· idx = 1(第二位 2):1234 / 10^2 % 10 = 2
· idx = 3(最低位 4):1234 / 10^0 % 10 = 4

  1. 也可以转成字符串取位
Strings=String.valueOf(num);returns.charAt(idx)-'0';

可读性更好,但性能略差(有字符串创建开销)。面试中两种都接受,推荐算术法。


手算验证

以 n = 11 为例:

  1. 第 1 层(1 位数):d = 1, count = 9, d*count = 9,11 > 9,跳过 → n = 11 - 9 = 2。
  2. 进入第 2 层:d = 2, start = 10, count = 90, d*count = 180,2 ≤ 180,停止。
  3. num = 10 + (2 - 1) / 2 = 10 + 0 = 10。
  4. idx = (2 - 1) % 2 = 1。
  5. num = 10 的第 1 位(0-indexed)为 0。✅

再验证 n = 1:

  1. d=1, count=9, d*count=9,1 ≤ 9,不跳过。
  2. num = 1 + (1-1)/1 = 1,idx = (1-1)%1 = 0,返回 1。✅

复杂度分析

· 时间复杂度:O(log n),循环次数等于 n 对应的数字位数(最多约 10 次)。
· 空间复杂度:O(1),仅使用常数额外空间。

这是本题的最优解法,也是官方推荐的数学推导法。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/24 2:24:10

Python 多线程与多进程并发深度解析

1. 背景:为什么 Python 并发总是"又爱又恨"Python 的并发话题几乎是每个工程师绕不开的争论场:有人说"Python 多线程是假的,被 GIL 锁死了",也有人说"Python 里跑并发就是自找麻烦,老老实实串…

作者头像 李华
网站建设 2026/10/24 2:23:57

MemGPT 是操作系统、Reflexion 是错题本:从 21 篇 Agent 记忆核心论文的“隐喻图谱“,看你的场景该配哪种记忆结构

MemGPT 是操作系统、Reflexion 是错题本:换一种方式理解 Agent 记忆 聊 Agent 记忆的文章,大多从“短期记忆 / 长期记忆”的二分法讲起。这个框架没错,但有个问题:它只回答了“记多久”,没回答“用什么结构记”。本文…

作者头像 李华
网站建设 2026/10/24 2:23:57

接入汇聚都是环怎么防环路?华为SEP加RRPP混合环

园区网为了链路备份普遍拉冗余链路,环一多麻烦就来了:报文在环里循环转发,广播风暴、MAC 地址表不稳定,最后用户通信中断。更棘手的是分层组网——汇聚层已经用 RRPP 协议防环,接入层新拉了一圈环,两层的防…

作者头像 李华
网站建设 2026/10/24 2:22:46

指针核心知识——从内存地址到多级指针

目录 一:内存二:计算机常见单位三:内存单元四:指针变量和地址五:指针运算六:传值调用与传址调用七:二级指针八:总结 引言 本文面向刚接触 C 语言的初学者,聚焦一个常见…

作者头像 李华
网站建设 2026/10/24 2:22:44

Flutter 3.47 鸿蒙三方库适配实战:从 0 到 1 处理 native_file_preview

Flutter 3.47 鸿蒙三方库适配实战:从 0 到 1 处理 native_file_preview 调用系统默认应用预览沙箱内的文件。 本文以 native_file_preview 1.1.0 为例,记录我如何保留原有 Dart API、补齐 Flutter OH 插件入口、在鸿蒙端接入真实系统能力,并…

作者头像 李华
网站建设 2026/10/24 2:22:38

DDD 领域驱动设计(04)· 战术设计(上):实体、值对象与聚合

DDD-04-战术设计-实体值对象与聚合 进入限界上下文内部,开始真正的建模。本篇讲三块基石:实体、值对象、聚合。其中聚合是 DDD 战术设计最核心的模式——它就是一致性的边界,也是事务的边界。而"聚合该画多大",是我见过…

作者头像 李华