Práctica diaria de preguntas de algoritmo --- Día 72: El número del número 1

¡Acostúmbrate a escribir juntos! Este es el séptimo día de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de abril", haga clic para ver los detalles del evento .

1. Descripción del problema

Dado un entero  n, cuente   el número de ocurrencias de todos n los enteros no negativos  menores o iguales.1

Enlace temático: El número del número 1

En segundo lugar, los requisitos de la materia.

Ejemplo 1

输入: n = 13
输出: 6
复制代码

Ejemplo 2

输入: n = 0
输出: 0
复制代码

visita

1.数学思想、超时优化
2.建议用时15~35min
复制代码

3. Análisis de problemas

Tan pronto como tuve en mis manos esta pregunta, sentí que algo estaba mal. Era una pregunta muy simple que solo necesitaba ser contada en un bucle. Likou en realidad le agregó una etiqueta difícil.

class Solution {
public:
    int countDigitOne(int n) {
        int i,k,ans=0;//初始化数据
        for(i=1;i<=n;i++)//循环1~n
        {
            k=i;
            while(k)//数位中是否包含1
            {
                if(k%10==1)
                    ans++;//计数
                k=k/10;
            }
        }
        return ans;//输出结果
    }
};
复制代码

Entonces, mi código definitivamente se agota.

1.png

17.png

Después de leer la solución >_<, descubrí que esta es una pregunta habitual:

2.png

Las reglas son las siguientes, basándose en las ideas de los grandes:

/**
从低往高位,计算每一位的数量:
第1位上的1的个数:1+(n-1)/10
第2位上的1的个数:(1+(n/10-1)/10)*10
第3位上的1的个数:(1+(n/100-1)/10)*100
……
第k+1位上的1的个数:(1+(n/(10^k)-1)/10)*(10^k)
如果n的第k+1位上是1,则说明可能没有填满该位,计算第k+1位的数量时还要 -10^k+1+n%(10^k),相当于独立计算
 */
复制代码

En cuarto lugar, la implementación de la codificación.

class Solution {
public:
    int countDigitOne(int n) {
        long long k = 1,ans = 0;//初始化数据
        while (n >= k){
            ans += (1+(n/k-1)/10)*k;//计数
            if (n/k%10 == 1) ans = ans-k+1+n%k;//当前位为1,减去数据
            k *= 10;
        }
        return ans;//输出结果
    }
};
复制代码

5. Resultados de la prueba

4.png

3.png

Supongo que te gusta

Origin juejin.im/post/7083646563754442783
Recomendado
Clasificación