Problema de Leetcode: ingrese un número entero n y encuentre el número de ocurrencias de 1 en la representación decimal de los n números enteros de 1 a n.

  Calcule el número de cada bit de menor a mayor.

  Tome 3104 como ejemplo, divídalo en tres partes: bit alto alto, bit de corriente actual, bit bajo bajo

  (1) Al contar el número de ocurrencias de un solo dígito: alto = 310; cur = 4, bajo = 0.

        Cuando 0 ~ 309 cambia, cur solo tiene 1 caso, por lo que hay 310 1s, porque cur = 4, por lo que cuando el bit alto es 310, también hay un 1; por lo que el número de veces que aparece 1 cuenta = 311;

  (2) Al calcular el lugar de las decenas: alto = 31, cur = 0, bajo = 4.

        Cada vez que 0 ~ 30 cambios, cur y low solo tienen 10 1s cuando son 10 ~ 19, porque cur = 0, entonces cuando el bit alto es 31, el número máximo es 3104, y no habrá 1, por lo que el número de ocurrencias del recuento de diez dígitos = 31 * 10 = 310;

  (3) Al calcular cientos: alto = 3, cur = 1; bajo = 4:

        Cada vez que cambia 0 ~ 2, cur y low solo tienen 100 1s cuando son 100 ~ 199, porque cur = 1, entonces cuando el bit alto es 3, hay 5 1s en los cientos, es decir, 3100 ~ 3104, entonces 1 en los cientos El número de veces cuenta = 3 * 100 + 5 = 305;

  (4) Al contar miles: alto = 0, cur = 3, bajo = 104.

        Como cur = 3, hay 1000 1s cuando cur y low son 1000 ~ 1999, y count = 1000.

  Suma para obtener el recuento = 1926.

 

  El algoritmo es: i = 1, 10,100 ... representa las unidades, decenas, cientos ...

      si (cur == 0) 

        cuenta = alto * i;

      si (cur == 1)

        recuento = alto * i + bajo + 1;

      si (cur> 1)

        cuenta = (alto + 1) * i;

       

int countDigitOne ( int n) {
     int i = 1 ;
    int cuenta = 0 ;
    while ((n / i! = 0 ) {
         int high;
         int cur;
         int low; 
        high = n / (i * 10 ); 
        cur = (n / i)% 10 ; 
        low = n - (n / i * i ); 
        
        if (cur == 0 ) { 
            count + = (high * i); 
        } else  if(cur == 1 ) { 
            cuenta + = (alto * i) + bajo + 1 ; 
        } else  if (cur> 1 ) { 
            count + = (high + 1 ) * i; 
        } 
        i * = 10 ; 
    } 
    cuenta de retorno ; 
}

2020/4/20

00:30

 

Supongo que te gusta

Origin www.cnblogs.com/zhengxunjie/p/12735299.html
Recomendado
Clasificación