1的数目
2015-08-27 12:18
211 查看
1的数目
简述
给定一个十进制正整数N,返回从1开始,到N的所有整数中出现1的个数(所有出现的1,包括个位、十位、百位等)方法
给出两种方法方法1思路:先考虑怎么计算某个整数中1出现的次数,如121,最直观的方法就是从个位开始判断,一直到最高位,再把出现1的次数加起来返回。然后有了计算某个整数出现的1的个数,就可以利用循环,把1到N出现1的个数都算出来再相加即可。时间复杂度是O(N*lgN),给出代码如下:
//method1 int countOnesInAInt(int n) { int iNum = 0; while (n != 0) { iNum += (n % 10 == 1) ? 1 : 0; n /= 10; } return iNum; } int countOnesVersion1(int input) { int iCount = 0; for (int i = 1; i <= input; i++) { iCount += countOnesInAInt(i); } return iCount; }
方法2思路:分别计算个位上出现1的次数、十位上出现1的次数直到最高位上出现1的次数,再加起来。而判断某位上出现1的次数可以分三种情况:如给定三个数12001,12101和12501,判断从1到N,百位上出现1的个数,当百位上的数为0的时候如12001,百位上出现1的个数为12*100 = 1200次,因为xx100到xx199一共在百位上有100个1出现,而xx从00到11一共12次,12则还没到100所以不用计算在内;当百位上的数为1的时候如12101,那么百位上出现1的个数为12*100 + 01 - 00 + 1 = 1202次,因为除了00-11的12次外,还有12100和12101两个百位上的1;当百位上的数大于1的时候,如12501,此时易得出现1的个数为13*100次。时间复杂度和给出的数的长度成正比,也即O(lgN),给出如下代码:
//method2 int countOnesVersion2(int input) { //initial int iCount = 0; int iFactor = 1; int iLowerNum = 0; int iCurrNum = 0; int iHigherNum = 0; while (input / iFactor != 0) { iCurrNum = (input / iFactor) % 10; iHigherNum = input / (iFactor * 10); //three conditions switch (iCurrNum) { case 0: iCount += iHigherNum * iFactor; break; case 1: iLowerNum = input % iFactor; iCount += iHigherNum * iFactor + iLowerNum + 1; break; default: iCount += (iHigherNum + 1) * iFactor; break; } iFactor *= 10; } return iCount; }
时间对比
这里是随意试了几个数字,发现方法1的用时随着输入数字的增加大幅度增加,而方法2的用时并没有随着输入增加而增加。
相关文章推荐
- OpenWrt网页刷机
- 关于C 指针作为返回值的问题
- UE3 Lightmass静态全局光照
- Effective Java 78条军规
- 阿里云ECS磁盘扩容步骤
- <jumbot:flashupload id="flashUpload1" runat="server"> </jumbot:flashupload>
- 经典SQL语句大全
- [leetcode] 53.Maximum Subarray
- s3c2440 LCD(sony x35)
- 在安卓程序中启动另一个程序
- 如何让div+css兼容ie6 ie7 ie8 ie9和FireFox Chrome等浏览器
- 【十九】一些实际工程中的问题
- JESD204B_SystemC_module Clk(2)
- 我的一个MFC小项目
- 【索引】Geometric Algorithms in 2D::Examples
- VMware虚拟机 ubuntu忘记密码解决方法
- 解决cocos2d-x 安卓锁屏再解锁,OPenGL报错;后台转前台异常问题解决办法
- 盆友
- 两个使用Python脚本操作文件的小示例分享
- Laravel5.1快速查询