您的位置:首页 > 其它

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

2016-07-27 21:27 295 查看
来源:牛客网

题目描述

输入一个数字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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: