美文网首页
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