剑指offer_44_数字序列中某一位的数字【javascript】

88 阅读2分钟

题目链接

leetcode.cn/problems/sh…

题目【中等】

数字以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 的一部分。

提示:

题解

直接计算

复杂度分析:

  • 时间复杂度 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 个数位
};