从1到n整数中1出现的次数

来源:牛客网

题目描述

输入一个数字n,求出1~n所有整数中1出现的次数。例如,求出1~13的整数中1出现的次数?1~13中包含1的数字有1、10、11、12、13因此共出现6次。
先贴个粗暴的解法:依次遍历每个数,通过%运算求得每个数中1的个数,累加起来:
public static int NumberOf1Between1AndN_Solution(int n) {
    int sum=0;
    for(int i=1; i<=n; ++i) sum+=getOne(i);
    return sum;
}

/*
13101/10=1310...1
1310/10=131...0
131/10=13...1
13/10=1...3
1/10=0...1
*/
public static int getOne(int n){
    int res=0;
    while(n!=0){
        if(n%10==1) res++;
        n /= 10;
    }
    return res;
}

其中getOne函数复杂度为lgn,因此总的复杂度为n*(lgn)。

更高效的方法是统计数字规律,将n的每一位置1,观察其他位的可能数,然后加起来。代码下次贴。

另外发现一点小规律:左边是n的取值,右边是[1,n]中1出现的次数。

n     numOf1(1...n)
1         1
10       2
100     21
1000      301
10000    4001
100000     50001
1000000   600001

cd

原文地址:https://www.cnblogs.com/duanguyuan/p/5712689.html