LeetCode打卡day10

91 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。”

一、题目描述:

数字序列中某一位的数字

数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。

请写一个函数,求任意第n位对应的数字。

 

示例 1:

输入:n = 3 输出:3

示例 2:

输入:n = 11 输出:0  

限制:

0 <= n < 2^31

二、思路分析:

当n<10时,很轻松的是一一对应关系,而当n>=10时,我们会发现对应关系出现了错位,10对应的是第10位、第11位,当n为三位数时错位更明显了。这是因为10占了两位,把11往后挤了。

如果我们把位数都补齐,我们会发现,映射关系变得清晰起来了 00|01|02|03|04|05|06|07|08|09|10 10就位于第10位(从0开始计数),而原来数组第10位位于新数组的第10+10=20位。对于三位数100,0~ 9要补00,10~ 99要补0,这样就增加了110个,原来的100位于100+110=210位。

那么我们如何判断当前位数n对应的位数要补多少呢?根据补完后的数量来判断,比如对于1位数肯定是1* 10;对于两位数,有100个数每个数长2,明显为2* 100,同样的n位数为n* 10^n,根据n的大小判断要补几位

同时我们发现对于11位,是取值10的 21%2;对于第10位取值10的20%2位,即看补全的位数,然后取余。

最后我们怎么通过新数组的位置判断位于哪个间隔里面,这个间隔的值是多少?答案很简单,就是整除当前补全的位数,例如对于原100位,小于200,补全后位于110位,而每,2个间隔对于原来的值,故只需要110整除2即可55,

三、AC代码

/**
 * @param {number} n
 * @return {number}
 */
var findNthDigit = function(n) {
    if(n<10)return n
    let wei=1
    while(wei*10**wei<n){
        n+=10**wei
        wei++
    }
    let digist=String(Math.floor(n/wei))
    return digist[n%wei]
};