一起刷LeetCode——第N位数字(模拟)

76 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

第N位数字

给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n **位上的数字。

分析

  • 这里的n指的是数字个数的第n位,当n=11的时候,返回0,第11位是数字10的0位置,所以在找第N位数字的时候,需要对数字进行一个划分:
    • 1-9,每个数字只有1位,是9*10^1=9
    • 10-99,每个数字有2位,是9*10^2=180
    • 100-999,每个数字有3位,是9*10^3=2700
    • 1000-9999,每个数字有4位,是9*10^4=36000
    • 以此类推
  • 首先根据n的值确定一个第n位数字所指向的数字的区间
  • 找到区间之后就确定了这个区间的最小值,通过1、10、100,可以得到是10的幂
  • 根据最小值,计算得到第n位数字所在的数字,要注意第n位是从1开始,而程序中都是从0开始,需要计算的时候使用(n-1)
  • 找到了数字之后就可以找到第n位数字了

代码

var findNthDigit = function(n) {
    var len = 1;
    var range = 9;
    var base = 1;
    while(n>len*range)
    {
        n -= len *range;
        range *= 10;
        base *= 10;
        len++;
    }
    var num = base + Math.floor((n-1)/len);
    var s = num.toString();
    return parseInt(s[(n-1)%len]);
};

总结

  • 这道题目比较符合日常的代码工作,有情景有问题,根据描述直接模拟就可以得出结果,不是那么的“算法”,但是能考验解决问题的能力,把一个大问题分成几个小问题,从一个大的范围一直缩小到可以得到结果的范围,从而得出结果,不用硬套算法没有解题模版,还原日常代码解决思路,解决了之后还是会有一些成就感,1024程序员节奖励自己一个简单题
  • 今天也是有收获的一天