[LeetCode]剑指 Offer 44. 数字序列中某一位的数字
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode]剑指 Offer 44. 数字序列中某一位的数字相关的知识,希望对你有一定的参考价值。
数字以 0123456789101112131415…
的格式序列化到一个字符序列中。在这个序列中,第 5 位(从下标 0 开始计数)是 5,第 13 位是 1,第 19 位是 4,等等。
请写一个函数,求任意第 n
位对应的数字。
示例 1:
输入:n = 3
输出:3
示例 2:
输入:n = 11
输出:0
限制:
- 0 <= n < 2^31
题解:
- 将 101112⋯ 中的每一位称为数位 ,记为 n
- 将 10,11,12,⋯ 称为数字 ,记为 num
- 数字 10 是一个两位数,称此数字的位数 为 2 ,记为 digit
- 每 digit 位数的起始数字(即:1,10,100,⋯),记为 start
观察上表,可推出各 digit 下的数位数量 count 的计算公式:count = 9 × start × digit
根据以上分析,可将求解分为三步:
- 确定 n 所在数字的位数 digit
- 确定 n 所在的数字 num
- 确定 n 是 num 中的哪一数位,并返回结果
-
确定所求数位的所在数字的位数
如下图所示,循环执行 n 减去一位数、两位数、… 的数位数量 count ,直至 n ≤ count 时跳出。
由于 n 已经减去了一位数、两位数、…、(digit−1) 位数的数位数量 count ,因而此时的 n 是从起始数字 start 开始计数的。
digit, start, count = 1, 1, 9 while n > count: n -= count start *= 10 # 1, 10, 100, ... digit += 1 # 1, 2, 3, ... count = 9 * start * digit # 9, 180, 2700, ...
结论: 所求数位 ① 在某个 digit 位数中; ② 为从数字 start 开始的第 n 个数位。
-
确定所求数位所在的数字
如下图所示,所求数位在从数字 start 开始的第
[(n − 1) / digit]
个 数字 中(start 为第 0 个数字)。num = start + (n - 1) // digit
结论: 所求数位在数字 num 中。
-
确定所求数位在 num 的哪一数位
如下图所示,所求数位为数字 num 的第(n − 1) % digit
位( 数字的首个数位为第 0 位)。s = str(num) # 转化为 string res = int(s[(n - 1) % digit]) # 获得 num 的 第 (n - 1) % digit 个数位,并转化为 int
结论: 所求数位是 res。
示例:
/**
* 剑指 Offer 44. 数字序列中某一位的数字
*/
public int findNthDigit(int n)
// 数字 num 的位数为 digit,num=1 时 digit=1, num=20 时 digit=2......
int digit = 1;
// 一位数 start=1,两位数 start=10,三位数 start=100......
long start = 1;
// digit 位数的 num 个数,一位数 count=9, 两位数 count=99-10+1=90......
long count = 9;
// 求得数位 n 对应 digit 和 start
while (n > count)
n -= count;
digit++;
start *= 10;
count = digit * start * 9;
// 求得数位 n 对应的数字 num
long num = start + (n - 1) / digit;
// 返回数位 n 对应的数字
return Long.toString(num).charAt((n - 1) % digit) - '0';
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof
以上是关于[LeetCode]剑指 Offer 44. 数字序列中某一位的数字的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode(剑指 Offer)- 44. 数字序列中某一位的数字
[LeetCode]剑指 Offer 44. 数字序列中某一位的数字
[LeetCode]剑指 Offer 44. 数字序列中某一位的数字
LeetCode993. 二叉树的堂兄弟节点 / 剑指 Offer 44. 数字序列中某一位的数字 / 剑指 Offer 45. 把数组排成最小的数