Un número en una secuencia de números (Java)

Un número en una secuencia de números (Java)

Título: Un
dígito en una secuencia de dígitos se
serializa en una secuencia de caracteres en el formato 0123456789101112131415 ... En esta secuencia, el 5 ° bit (contando desde 0) es 5, el 13 ° bit es 1, el 19 ° bit es 4, y así sucesivamente. Escriba una función para encontrar el número correspondiente a cualquier dígito.
Idea: Por
ejemplo, análisis, por ejemplo, para encontrar el dígito 1001,
1) Hay 10 valores de 1 dígito: 0 ~ 9, el número es 10 × 1 = 10, obviamente 1001> 10, omita estos 10 valores, en la parte posterior Encuentra el 991º (1001-10) dígito.
2) Hay 90 valores de 2 dígitos: 10 ~ 99, el número es 90 × 2 = 180 y 991> 180, continúan encontrando los dígitos 811 (991-180) en la parte posterior.
3) Hay 900 valores de 3 dígitos: 100 ~ 999, el número es 900 × 3 = 2700 y 811 <2700, lo que indica que el 811 dígito está en el valor con 3 dígitos. Como 811 = 270 × 3 + 1, el dígito 811 es el valor numérico 270 a partir de 100, o el segundo dígito de 370, que es 7.
De acuerdo con esta regla, se pueden obtener otras cifras.
Código:

public class DigitsInSequence
{
    public static void main(String[] args)
    {
        System.out.println(digitAtIndex(9)); //9
        System.out.println(digitAtIndex(189)); //数字99的最后一位:9
        System.out.println(digitAtIndex(190)); //数字100的第一位:1
    }

    private static int digitAtIndex(int index)
    {
        if (index < 0) return -1;
        int digits = 1;
        while (true)
        {
            int digitNumbers = countOfNumbersFor(digits); //当前位数的数值个数
            //数值乘上它的位数等于数字个数,
            //比如,两位数有90个(10~99),每个数值有2个数字,总数字个数为180
            int countOfNumbers = digitNumbers * digits;
            if (index < countOfNumbers)
            {
                return digitAtIndex(index, digits);
            } else
            {
                //在下一位中查找
                index -= countOfNumbers;
                digits++;
            }
        }
    }

    //digits位数的数字个数,
    //两位数有9*10=90个(10~99),三位数有9*100=900个(100~999)
    private static int countOfNumbersFor(int digits)
    {
        if (digits == 1)
            return 10;

        int count = (int) Math.pow(10, digits - 1);
        return 9 * count;
    }

    private static int digitAtIndex(int index, int digits)
    {
        //对应的数值
        int number = beginNumberFor(digits) + index / digits;
        //从数值右边开始算的位置
        int indexFromRight = digits - index % digits;
        //去除右边的indexFromRight-1个数字
        for (int i = 1; i < indexFromRight; i++)
            number /= 10;
        //求个位数字
        return number % 10;
    }

    //digits位数的第一个数字,两位数从10开始,三位数从100开始
    private static int beginNumberFor(int digits)
    {
        if (digits == 1)
            return 0;

        return (int) Math.pow(10, digits - 1);
    }
}
Publicado 71 artículos originales · elogiado 0 · visitas 878

Supongo que te gusta

Origin blog.csdn.net/sinat_40968110/article/details/105482321
Recomendado
Clasificación