“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]
};