考点:本题考查时间效率
题目描述:
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
示例 :
输入:n = 11
输出:0
限制:0 <= n < 2^31
思路:举例分析
分析序列的第1001位是什么
序列的前10位是0-9这10个只有一位的数字。显然第1001位在这10个数字之后,因此这10个数字可以直接跳过。再从后面紧跟着的序列中找第991(991=1001-10)位的数字。接下来180位数字是90个10-99的两位数。由于991>180,所以第991位再所有的两位数之后。再跳过90个两位数,继续从后面找811(811=991-180)位。接下来的2700位是900个100-999的三位数。由于811<2700,所以第811位是某个三位数中的一位。由于811=270×3+1,就是说第811位是从100开始的第270个数字即370的中间一位,也就是7。
import java.lang.Math;
class Solution {
public int findNthDigit(int index) {
if(index<0||index>Math.pow(2,31))
return -1;
int m=1; //m位数
while(true) {
int numbers=countOfIntegers(m); //m位数的个数
if(index<numbers*m)
return getDigit(index,m);
index-=numbers*m;
m++;
}
}
/*
* 返回m位的数字总共有多少
* 例如,两位数一共有90个:10~99;三位数有900个:100~999
*/
private int countOfIntegers(int m) {
if(m==1)
return 10;
return (int) (9*Math.pow(10, m-1));
}
/*
* 获取数字
*/
private int getDigit(int index, int m) {
int number=getFirstNumber(m)+index/m; //对应的m位数
int indexFromRight = m-index%m; //在数字中的位置
for(int i=1;i<indexFromRight;i++)
number/=10;
return number%10;
}
/*
* m位数的第一个数字
* 例如第一个两位数是10,第一个三位数是100
*/
private int getFirstNumber(int m) {
if(m==1)
return 0;
return (int) Math.pow(10, m-1);
}
}
报错未解决
报错.PNG
网友评论