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;



    }

 

posted @ 2018-09-25 20:39  朋友圈  阅读(241)  评论(0编辑  收藏  举报