剑指offer40_数字序列中某一位的数字
数字序列中某一位的数字
数字以 0123456789101112131415… 的格式序列化到一个字符序列中。
在这个序列中,第 5 位(从 0 开始计数)是 5,第 13 位是 1,第 19 位是 4,等等。
请写一个函数求任意位对应的数字。
数据范围
0≤ 输入数字 ≤2147483647
样例
输入:13输出:1
算法思路
该算法用于解决数字序列的第n位问题(序列格式:123456789101112131415...
),核心分为两步:
- 定位数字所在的区间:
- 确定第
n
位对应的数字是几位数(i
位)。 - 通过逐步减去
i
位数的总位数(i * s
),缩小n
的范围。 base
表示当前i
位数的最小值(如i=3
时base=100
)。
- 确定第
- 提取具体数字的某一位:
- 计算目标数字
number
:base + (n + i - 1) / i - 1
。 - 确定
number
中的第r
位(通过取模和除法操作)。
- 计算目标数字
维度 | 值 | 说明 |
---|---|---|
时间复杂度 | O ( log 10 n ) O(\log_{10} n) O(log10n) | 最多循环 log 10 n \log_{10}n log10n次(数字位数增长) |
空间复杂度 | O ( 1 ) O(1) O(1) | 仅用常数变量,无额外空间 |
class Solution {
public:int digitAtIndex(int n) {/*对于n来说:i:是个几位数;s:该位数有多少个;base:该位数的起始数字;*/long long i = 1, s = 9, base = 1;while(n > i * s){n -= n * s;i ++;s *= 10;base *= 10;}//是几位数的第几个数,那个数就是numberint number = base + (n + i - 1) / i - 1;//是那个数的几分位,n%i=0 表示是最后一位个位;int r = n % i ? n % i : i;for(int j = 0; j < i - r; j ++) number /= 10;return number % 10;}
};