【Offer】[44] 【数字序列中某一位的数字】

时间:2019-08-19
本文章向大家介绍【Offer】[44] 【数字序列中某一位的数字】,主要包括【Offer】[44] 【数字序列中某一位的数字】使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目描述

  数字以0123456789101112131415..的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。

[牛客网刷题地址] 无

思路分析

  1. 数字位数为1时 ,共有10个1位数
  2. 数字位数为2时 ,共有9*10个2位数
  3. 数字位数为3时 ,共有9*(10^2)个3位数
  4. ...
  5. 数字位数为m时 ,共有9*(10^(m-1))个m位数

当给出序列号为index时,我们可以跳过比个数比index小的m位个数(要累加)。详见代码

测试用例

  1. 功能测试:输入10、190、 1000 等。
  2. 边界值测试:输入0、1等。

Java代码

public class Offer044 {
    public static void main(String[] args) {
        test1();
        test2();
        test3();
        
    }

    public static int  digitAtIndex(int index) {
        return Solution1(index);
    }

    private static int Solution1(int index) {
        if(index<0) {
            return -1;
        }
        int m=1; // m位数
        while(true) {
            int numbers = countOfIntegers(m);//得到m位数的个数
            if(index<numbers*m) {//如果 序列号小于 m位数所占的位数
                return getDigit(index,m);
            }
            index -= m*numbers;
            m++;
        }   
    }

    /**
     * 得到m位数的个数 
     * m=1时 0~9 10个
     * m=2时 10~99 9*10
     * m=3时 100~999 9*(10^2)
     * @param m
     * @return
     */
    private static int countOfIntegers(int m) {
        if(m==1) {
            return 10;
        }
        return (int) (9*Math.pow(10, m-1));
    }
    /**
     * 获取数字
     * @param index
     * @param m
     * @return
     */
    private static 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位数的首个数字
     * m=1, 0
     * m=2, 10
     * m=3, 10^2
     * 
     * @param m
     * @return
     */
    private static int getFirstNumber(int m) {
        if(m==1)
            return 0;
        return (int) Math.pow(10,m-1);
    }

    private static void test1() {
        System.out.println(digitAtIndex(1000));
    }

    private static void test2() {
        System.out.println(digitAtIndex(0));
    }
    private static void test3() {
        System.out.println(digitAtIndex(1));
    }
}

代码链接

剑指Offer代码-Java

原文地址:https://www.cnblogs.com/haoworld/p/offer44-shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi.html