来源:牛客网
题目描述
输入一个数字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