从1到n整数中1出现的次数
2016-07-27 21:27
295 查看
来源:牛客网
先贴个粗暴的解法:依次遍历每个数,通过%运算求得每个数中1的个数,累加起来:
其中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
题目描述
输入一个数字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
相关文章推荐
- 10009---怎么查看linux版本
- Memcache的最佳实践方案
- 认识Servlet
- 10009---压力测试之badboy和Jmeter的简单使用方法
- HDU 1241 Oil Deposits(深搜基础模板)
- 什么东西只花十分钟,但是受益终身
- laravel5数据库操作
- Ionic环境搭建
- 使用class-dump导出其他应用头文件
- JSTL的配置与使用
- 奇怪的问题,列名无效
- Codeforces-448【A数学函数ceil】【B思维】【D二分】
- Redis 和 Memcache 的性能对比基础篇
- 项目安排[动态规划]
- 基于spark的DataFrame实战
- Struts2的三种参数传递方式
- HDOJ 1551 Cable master
- JAVA中实现链式操作(方法链)的简单例子
- 图形学(7)光照模型
- hdu5758Explorer Bo