统计1到n这n个数中出现1的个数
2016-05-18 00:21
148 查看
拿到这个题目,第一想法就是挨个遍历这n个数,然后依次统计,这样效果很低,考虑的情况也很多。而且,这种做法,根本不会引起面试官对我们的青睐!所以,无疑,需要改进!!! 有一个比较好的解决办法是:直接看代码,比较好解释!
public int NumberOf1Between1AndN_Solution(int n) { if(n<=0) return 0; return NumberOf1(n); } public int NumberOf1(int n){ //将n转换为字符串类型,便于操作 String str=n+""; int len=str.length(); int count=0; //记录这个数的最高位 int t=Integer.valueOf(str.substring(0, 1)); if(n<=0) return 0; if(len==1 && n>0) return 1; if(t>1){ /*当n的最高位大于1时,那么必然当n等于1时候,有10..0-19..9个数,这时有1..0个1*/ count=(int)Math.pow(10, len-1); } else if(t==1){ count=Integer.valueOf(str.substring(1, len))+1; } /*这里用到了排列组合知识:因为此时不考虑最高位1的情况,此时最高位取值情况是1到t,剩余(n-1)中某位是1,有(n-1)种情况,然后剩余的(n-2)位的取值情况有10种,所以得出如下算式:*/ count+=t*(len-1)*((int)Math.pow(10, len-2))+NumberOf1(Integer.valueOf(str.substring(1,len))); return count; }
相关文章推荐
- mininet实战3
- 逆向学习中扫雷第一阶段小结
- 读书笔记《iPhone应用开发从入门到精通》——动态绑定和确定类型api
- 工具篇之计算机PC
- Azure File文件共享(6):使用Python开发
- c3p0连接sql2005数据库
- Android开发用的名词
- proxy.note
- CODEVS 1258 关路灯
- CODEVS 1258 关路灯
- 《Nodejs开发加密货币》之十四:Js处理数据计算的缺陷和解决方案
- 关于Makefile.am中与Build相关的变量设置 AM_CPPFLAGS
- C++ STL实例(一)
- ng-repeat orderby:notarray
- Node.js 函数
- VIJOS 1985 小h的妹子树一
- Java:interrupt()、interrupted()、isInterrupted()
- 2016/5/18
- POJ 1469 COURSES
- POJ 1469 COURSES