题目链接
题目【中等】
数字以0123456789101112131415...的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。
示例
示例 1:
输入:n = 5
输出:5
示例 2:
输入:n = 12
输出:1
解释:第 12 位数字在序列 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 1 ,它是 11 的一部分。
提示:
- 0 <= n < 231
- 注意:本题与主站 400 题相同:leetcode-cn.com/problems/nt…
题解
直接计算
复杂度分析:
- 时间复杂度 O(logn) : 所求数位 k 对应数字 num 的位数 digit 最大为 O(logn) ;第一步最多循环 O(logn) 次;第三步中将 num 转化为字符串使用 O(logn) 时间;因此总体为 O(logn) 。
- 空间复杂度 O(logn) : 将数字 num 转化为字符串 str(num) ,占用 O(logn) 的额外空间。
数字范围:
- 1-9,位数1,数字量9个,位数和9个
- 10-99,位数2,数字量90个,位数和90个
- 100-999,位数3,数字量900个,位数和900个 数位数量 count计算公式:count = 9 × start(起始数字) × digit(位数)
/**
* @param {number} n
* @return {number}
*/
var findKthNumber = function(n) {
let digit = 1; // n 所在 数字 的 位数
let start = 1; // 1, 10, 100, 1000
let count = 9; // 9, 180, 2700, 36000
while (n > count) { // 计算start和digit, 余数n
n -= count;
start *= 10;
digit += 1;
count = 9 * start * digit;
}
// 所求数位 在从数字 start 开始的第 (n−1)/digit 个 数字 中(start为第 0 个数字)
let num = start + (n - 1) / digit;
return + String(num)[(n - 1) % digit]; // 获得 num 的 第 (k - 1) % digit 个数位
};