• 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;
    
    
    
        }

  • 相关阅读:
    Python学习(一)
    使用OpenSSL生成CSR文件,并申请全球通用SSL证书
    windows 8.0 mysql 修改root 密码
    redis 本地安装
    spring boot(三)Junit 测试controller
    idea自动生成serialversionUID
    spring boot(二)热部署
    spring boot(一)创建项目
    Oracle中dual表的用途介绍
    Pass Data Between ASP.NET Pages
  • 原文地址:https://www.cnblogs.com/weizhibin1996/p/9703377.html
Copyright © 2020-2023  润新知