题目:序列化的数字,0123456789101112131415…。0对应第0位,9对应第9位,但是第10位为1。给你一个n,让你求第n位的数字是几?(0~9)
public int findNthDigit(int n)
思路:找规律题。
1.先根据n来找到该数字的位数
(1位数,1到9,有9位。2位数,10到99,有180位=9乘10乘2。3位数,100到999,有2700位=9乘100乘3。用interval-1表示该n与start=1/10/100…的距离,digit表示所求位数。
可以使用while当temp小于count位数时才结束循环(不需要当temp为0时结束,不好实现)。但是这个没有考虑到单数位,需要前面再考虑一下。在while里完成所有变量的更新。)
2.再找到该数字是几
(用interval-1再除digit求出与start数字之间的距离)
3.再确定所要的位是这个数字的第几位
(用interval-1再%digit来映射到start的位,来得到)
注意:start每次乘10,会超出int范围,所以由start得到的变量都要写为long,全部都写为long就好。
最后用了化为string里面取char,基本操作要可以写出来。
全程可以举n=15的例子,结果为2。来作为参考。
public int findNthDigit(int n) {
long temp = n,interval = 0,count = 9,start = 1,digit = 1;
//处理单位数
if(temp <= count) return (int)temp;
/*
只要temp小于count的时候就停下来(两个都在变化)
没有考虑单数位的情况,所以上面才去处理单数位。
log10n,因为是算的n的位数
*/
while(temp > count){
interval = temp - count;
temp -= count;
//所有的变化都写在while里
start *= 10;
count = 9 * start * (digit + 1);
digit++;
}
long num = start + (interval - 1) / digit;
String tempStr = String.valueOf(num);
char res = tempStr.charAt((int)((interval - 1) % digit));
return res - '0';
}