【剑指offer】整数中1出现的次数
来源:互联网 发布:arduino编程教程 编辑:程序博客网 时间:2024/05/21 07:27
转载请注明出处:http://blog.csdn.net/ns_code/article/details/27563485
- 题目描述:
亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他。问题是:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
- 输入:
输入有多组数据,每组测试数据为一行。
每一行有两个整数a,b(0<=a,b<=1,000,000,000)。
- 输出:
对应每个测试案例,输出a和b之间1出现的次数。
- 样例输入:
0 51 1321 5531 99
- 样例输出:
1647
最简单的方法,分别求从1到n之间每个数中的1的个数,由于整数n的位数为O(logn),我们要判断一个数有多少个1,需要判断其每一位是否为1,这样一个数就需要判断O(logn)次,而总共有n个数需要求,那么该方法的时间复杂度为O(nlogn)。在九度OJ上用该方法写的代码测试,会超时。
剑指offer上给了一种递归的思路,能将时间复杂度降到O(logn),总感觉这个思路有点偏,而且很难想到,我没仔细看。我的想法是各位分开统计,而且看到何海涛博客下面很多人留言,也用了这样的方法,就看了下详细的思路,并自己推导了下公式,写出了代码,感觉这种方法还是很nice的,直观易懂,而且代码简洁,时间复杂度同为O(logn)。
这种方法的思路大概是这样的(懒得动手打了,直接copy):
按每一位来考虑,
1)此位大于1,这一位上1的个数有 ([n / 10^(b+1) ] + 1) * 10^b
2)此位等于0,为 ([n / 10^(b+1) ] ) * 10^b
3)此位等于1,在0的基础上加上n mod 10^b + 1
举个例子:
/**************************************************************
Problem: 1373
User: mmc_maodun
Language: C
Result: Accepted
Time:0 ms
Memory:912 kb
****************************************************************/
- 【剑指offer】整数中1出现的次数
- 剑指offer 32 整数中1出现的次数
- 【剑指offer】整数中1出现的次数
- 剑指offer—整数中1出现的次数
- 【剑指offer】之整数中1出现的次数
- 剑指offer——整数中1出现的次数
- 剑指offer - 整数中1出现的次数
- 剑指offer-整数中1出现的次数
- 剑指offer-整数中1出现的次数
- 【剑指offer】整数中1出现的次数
- 剑指offer-整数中1出现的次数
- 剑指offer 32 整数中1出现的次数
- 《剑指offer》整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer--整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指Offer--032-整数中1出现的次数(从1到n整数中1出现的次数)
- [剑指offer]整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer-整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指Offer:整数中1出现的次数(从1到n整数中1出现的次数)
- lua标准库函数
- JavaSript模块规范
- chm打开目录显示,查看内容不显示
- 利用Spring中的多方法控制器实现数据查询和删除操作
- 在S3C2440烧写程序
- 【剑指offer】整数中1出现的次数
- 通过CMake构建项目
- 8-TCP 协议(断开连接)
- CSDN学霸课表——144项大神级ppt制作技术
- KVC 和 OC字典
- 软件设计之——“高内聚低耦合”
- 【剑指offer】异或去重
- Git 和 SVN的区别总结
- Android 5.1 添加硬件抽象层(HAL)和JNI接口总结