LeetCode Number of Digit One
2015-10-29 13:07
363 查看
原题链接在这里:https://leetcode.com/problems/number-of-digit-one/
每10个数, 有一个个位是1, 每100个数, 有10个十位是1, 每1000个数, 有100个百位是1. 做一个循环, 每次计算单个位上1得总个数(个位,十位, 百位).
例子:
以算百位上1为例子: 假设百位上是0, 1, 和 >=2 三种情况:
case 1: n=3141092, a= 31410, b=92. 计算百位上1的个数应该为 3141 *100 次.
case 2: n=3141192, a= 31411, b=92. 计算百位上1的个数应该为 3141 *100 + (92+1) 次.
case 3: n=3141592, a= 31415, b=92. 计算百位上1的个数应该为 (3141+1) *100 次.
以上三种情况可以用 一个公式概括:
AC Java:
每10个数, 有一个个位是1, 每100个数, 有10个十位是1, 每1000个数, 有100个百位是1. 做一个循环, 每次计算单个位上1得总个数(个位,十位, 百位).
例子:
以算百位上1为例子: 假设百位上是0, 1, 和 >=2 三种情况:
case 1: n=3141092, a= 31410, b=92. 计算百位上1的个数应该为 3141 *100 次.
case 2: n=3141192, a= 31411, b=92. 计算百位上1的个数应该为 3141 *100 + (92+1) 次.
case 3: n=3141592, a= 31415, b=92. 计算百位上1的个数应该为 (3141+1) *100 次.
以上三种情况可以用 一个公式概括:
(a + 8) / 10 * m + (a % 10 == 1) * (b + 1);
期中 (a+8)/10 是用来判断该位是否大于等于2.
AC Java:
public class Solution { public int countDigitOne(int n) { //(a+8)/10*m + (a%10 == 1)*(b+1) int res = 0; for(long m = 1; m<=n; m*=10){ long a = n/m; long b = n%m; res+=(a+8)/10 * m; if(a%10 == 1){ res+=(b+1); } } return res; } }
相关文章推荐
- RedHat升级Python到2.7.6
- 百度搜索框智能提示功能代码
- PHP中关于foreach的简单的用法总结
- Annotation
- javascript: detect mobile devices or browser
- PHP中关于foreach的简单的用法总结
- javascript: detect mobile devices or browser
- Apache Hadoop2.0之HDFS均衡操作分析
- 多线程卖票,死锁问题和生产者消费者问题!
- Centos 部署安装keepalived(1)
- POJ 3069 Saruman's Army 贪心
- Log4j2在WEB项目中配置
- Java编程思想 - 第7章、复用类
- 删除文件后,磁盘可用空间并没有释放怎么办?
- Andriod控件PopupWindow嵌套Listview
- iOS笔试题
- 【转】Linux网络编程入门
- BarCode Reader SDK使用教程:如何从图像中读取条码
- OAuth 2.0 授权原理
- 【FastDev4Android框架开发】AndroidAnnnotations注入框架使用之注入组件Components(九)