LeetCode400-第N个数字(算术题)
我也不知道灵感怎么来的
【个位数】【十位数】【百位数。。。。。。
占一个位置 两个 三个
所以在数组里面就是
9个个位数 90个10位数 ,这里面单个数字就是2*90 900个百位数 这里面单个数字就是3*900
【xxxxxxxxx】【xx xx xx xx 。。。。。。。xx xx】 【xxx xxx xxx xxx 。。。。。xxx】
位数增长1、2、3、4、5、6、7、8、9,就之后其实就快溢出了
每位有多少数字9、90、900、9000、90000、都是有规律的,九位数就有9亿个了,所以不会到达10位的
假如n是在千位数那个区域
所以,n减去个位数占的数字,十位数占的数字、百位数占的数字。。。。。。剩余的就可以通过取余找到了
n -= ( 9 - 2*90 - 3*900) 。
剩下的 千位数,因为一个千位数,占4个位置,所以1000+(n/4)-1,就是对应的那个数字了。
然后再根据n%4,选择那个数字的第x位即可。
主要是正确理解,这个n代表着什么吧。这个n,是由单个数字组成的,百位数,一个数字就占个3位。
剩下的就是一些细节的问题了
public int findNthDigit(int n) { if(n<=9) return n; //位数 int count = 1; //一开始只有9个、90、900、9000 int begin = 9; while(true){ //在第10次,就是10x90亿了,会溢出。肯定不会>=10 //9之后已经是这道题目的极限,不用再判断第10次了 if(count==9) break; if(n>(count*begin)){ n-=(count*begin); count++; begin*=10; }else{ break; } } //出来之后,n在该范围之间 //n如果是中间的数字,会导致少一个 int temp = (n/count); if(n%count>0){ temp+=1; } //第一个十位数是9+1 10+1-1 //第一个百位数是99+1 100+1-1 //第tmep个是999····9+temp 100····0+temp-1 //也就是 int num = (int)Math.pow(10,count-1)+temp-1; int index = n%count; //0其实是最后一位 if(index==0) return num%10; //取这个数的第index位,从左到右的 return (num/((int)Math.pow(10,count-index)))%10; }