美文网首页
44.数字序列中某一位的数字(中等)***

44.数字序列中某一位的数字(中等)***

作者: 今天柚稚了么 | 来源:发表于2020-02-19 22:36 被阅读0次

    考点:本题考查时间效率

    题目描述:

    数字以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

    相关文章

      网友评论

          本文标题:44.数字序列中某一位的数字(中等)***

          本文链接:https://www.haomeiwen.com/subject/dvwifhtx.html