1 con el número (21) n es un número entero de 1 aparece

título

título


El método
será se lleva a cabo un número de cada dígito de la suma, el resultado final es una aparece número total. Sin embargo, este método es menos eficiente, es la complejidad de tiempo la ( norte * l la sol norte ) O (n * log_n) , Cuando n es muy grande, se requiere una gran cantidad de computación.
código:

class Solution {
public:
    int NumberOf1Between1AndN_Solution(int n)
    {
        if(n<=0)
            return 0;
        int sumOfOne=0;
        //注意边界条件:起始是从1开始的
        for(int i=1;i<=n;++i)
        {
            sumOfOne+=NumOfOne(i);
        }
        return sumOfOne;
    }
    
    int NumOfOne(int n)
    {
        int everyCount=0;
        // 求每个数字中有多少个1
        while(n)
        {
            if(n%10==1)
                ++everyCount;
            n/=10;
        }
        return everyCount;
    }
};

Método dos:
uno, el análisis
lata norte norte es juzgado para contener cada dígito del número 1. n contiene l la sol norte calma bits.
Ideas resolución de problemas
2, el código

class Solution {
public:
    int NumberOf1Between1AndN_Solution(int n)
    {
    int count = 0;
    long long i = 1;
    for(i = 1; i <= n; i *= 10)
    {
        //i表示当前分析的是哪一个数位
        int a = n / i, b = n % i;
        count = count + (a + 8) / 10 * i + (a % 10 == 1) * (b + 1);
    }
    return count;
    
    }
};
Publicados 213 artículos originales · ganado elogios 48 · vistas 110 000 +

Supongo que te gusta

Origin blog.csdn.net/Jeffxu_lib/article/details/104730115
Recomendado
Clasificación