题目描述
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
示例:
输入:n = 3
输出:3
示例2:
输入:n = 11
输出:0
题目解答
分析规律,定位n位于的区间。假设n=1001
0-9共10个数字,索引为0-9;10-99共90个数字,占了180位,索引是0-179;100-999共900个数字,占2700位。
所以,1001位是某个三位数中的一位数字。
1001-10-180 = 811,说明是所有三位数序列中的第811位;
811/3=270,余1,表明是三位数集合中的第270个三位数中的中间一位。即270+100 = 370,中间位为数字7。
var findNthDigit = function(n) {
if(n<0){
return -1;
}
var digit = 1;
while(true){
// number: digit位数的个数
var number = countOfIntegers(digit);
if(n < number*digit){
return digitAtIndex(n,digit);
}
n-=number*digit;
digit++;
}
return -1;
};
// countOfIntegers:计算位数位m的数字共多少个,返回个数
var countOfIntegers = function(m){
if(m==1){
return 10;
}
var count = Math.pow(10,m-1);
return 9*count;
}
// 判断index是区间内的哪个数字
var digitAtIndex = function(index,digit){
var num = index/digit;
var indexOfResult = index%digit;
var number;
if(digit==1){
number = num;
}else{
// 计算number:index对应位数所在的数字
number = Math.pow(10,digit-1)+num;
}
var result;
for(var i=digit;i>indexOfResult;i--){
result = parseInt(number%10);
number =parseInt(number/10);
}
return result;
}