剑指Offer——数字序列中某一位的数字(JS实现)

简介: 剑指Offer——数字序列中某一位的数字(JS实现)

题目描述

image.png

解题思路(数学规律)

  • 本题主要是寻找数学规律,通过暴力的方法肯定是超时的,下面就简单介绍下本题的解题思路,我认为核心还是在于理解将字符串拆分为不同位数的区间。
  1. 首先判断n在哪一个区间,区间的划分按照 1 - 9,10-99,100-999...
  2. 计算下标n在当前区间的哪一个
  3. 求出n下标对应的真实的数字
  4. 求出该真实数字的哪一位是我们最终要返回的结果

公式

n下标对应的真实数字=区间起始值+(区间第几个−1)/第几个区间n下标对应的真实数字 = 区间起始值 + (区间第几个 - 1) / 第几个区间n=+1/

真实数字的哪一位=(区间第几个−1)%第几个区间取余真实数字的哪一位 = (区间第几个 - 1)\% 第几个区间取余=1%

解题代码

var findNthDigit = function(n) {
    // 这里的n是下标
    // 如果下标小于10,直接返回n即可
    if (n < 10) {
        return n;
    }
    // 走到这里,说明n大于等于10,如果大于等于10,则要首先判断在下标n在哪个区间
    let numInterval = 0;
    for (let i = 1; i < 100; i++) {
        if ((n - 9) < 9 * Math.pow(10,i) * (i+1)) {
            numInterval = i+1;
            break;
        } 
    }
    // 计算下标n  在当前区间的第几个  
    for (let i = 0; i < numInterval-1; i++) {
        n = n - 9 * (10 ** i) * (i+1);
    }
    // n所指向的下标对应的真实的数字 = 区间起始值 + (区间第几个 - 1) / 第几个区间
    const trueNum = 10 ** (numInterval - 1) + parseInt( (n - 1) / numInterval )
    // 真实的数字可能是一个多位数,但是题目要求返回的是下标指向的一个数字,所以下标指向的一个数字就是 
    // (区间第几个 - 1) % 第几个区间
    const numIndex = (n - 1) % numInterval;
    return String(trueNum)[numIndex]
};

总结(本题给我们的启示思路)

  • 启示:学会通过数学规律来求解问题
相关文章
|
3月前
|
存储 JSON JavaScript
「offer来了」保姆级巩固你的js知识体系(4.0w字)
该文章提供了JavaScript知识体系的全面复习资料,覆盖了从基础语法到高级特性如闭包、原型链、异步编程等多个方面,并通过大量的面试题和实例代码帮助巩固理解。
「offer来了」保姆级巩固你的js知识体系(4.0w字)
|
3月前
|
JavaScript 前端开发
JavaScript写的序列代码生成器
JavaScript写的序列代码生成器
|
5月前
|
JavaScript 前端开发 算法
前端 JS 经典:最长递增子序列
前端 JS 经典:最长递增子序列
53 2
|
6月前
|
存储 JavaScript 前端开发
JavaScript中的数组是核心数据结构,用于存储和操作序列数据
【6月更文挑战第22天】JavaScript中的数组是核心数据结构,用于存储和操作序列数据。创建数组可以使用字面量`[]`或`new Array()`。访问元素通过索引,如`myArray[0]`,修改同样如此。常见方法包括:`push()`添加元素至末尾,`pop()`移除末尾元素,`shift()`移除首元素,`unshift()`添加到开头,`join()`连接为字符串,`slice()`提取子数组,`splice()`进行删除、替换,`indexOf()`查找元素位置,`sort()`排序数组。还有其他如`reverse()`、`concat()`等方法。
133 2
|
7月前
|
JavaScript 前端开发
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
|
7月前
|
算法 JavaScript
JS算法-最长连续序列
JS算法-最长连续序列
|
7月前
|
JavaScript 前端开发
JavaScript题解剑指offer : 09. 用两个栈实现队列
JavaScript题解剑指offer : 09. 用两个栈实现队列
46 0
|
JavaScript 前端开发 程序员
六个 JavaScript 中有效的转义序列
六个 JavaScript 中有效的转义序列
107 0
|
JavaScript 前端开发 程序员
《剑指 Offer(第 2 版)》树部分JavaScript题解
《剑指 Offer(第 2 版)》树部分JavaScript题解
《剑指 Offer(第 2 版)》树部分JavaScript题解
|
存储 JavaScript 前端开发
《剑指 Offer(第 2 版)》队列部分 JavaScript 题解
《剑指 Offer(第 2 版)》队列部分 JavaScript 题解