Leetcode181:Number of Digit One
2015-12-05 13:34
465 查看
Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.
For example:
Given n = 13,
Return 6, because digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.
很显然,我们可以按照位一个一个找,即在个位、十位、百位。。。出现过的1。
现在直接给出N的一般规律,比如N=abced五位数字的时候,我们分析百位c,有三种情况:
1)c == 0的时候,比如12013,此时百位出现1的是:00 100 ~ 00 199, 01 100~01 199,……,11 100~ 11 199,共1200个,显然这个有高位数字决定,并且受当前位数影响;
2)c == 1的时候,比如12113,此时百位出现1的肯定包括c=0的情况,另外还需要考虑低位的情况即:00100 ~ 00113共114个,
3)c >= 2的时候,比如12213,此时百位出现1的是:00 100 ~ 00 199, 01 100~01 199,……,11 100~ 11 199,12 100 ~ 12 199,共1300个,这个有高位数字决定,其实是加一,并且乘以当前位数
For example:
Given n = 13,
Return 6, because digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.
很显然,我们可以按照位一个一个找,即在个位、十位、百位。。。出现过的1。
现在直接给出N的一般规律,比如N=abced五位数字的时候,我们分析百位c,有三种情况:
1)c == 0的时候,比如12013,此时百位出现1的是:00 100 ~ 00 199, 01 100~01 199,……,11 100~ 11 199,共1200个,显然这个有高位数字决定,并且受当前位数影响;
2)c == 1的时候,比如12113,此时百位出现1的肯定包括c=0的情况,另外还需要考虑低位的情况即:00100 ~ 00113共114个,
3)c >= 2的时候,比如12213,此时百位出现1的是:00 100 ~ 00 199, 01 100~01 199,……,11 100~ 11 199,12 100 ~ 12 199,共1300个,这个有高位数字决定,其实是加一,并且乘以当前位数
class Solution { public: int countDigitOne(int n) { long count = 0; long factor = 1; while (n / factor != 0) { long lower = n % factor; long cur = (n / factor) % 10; long higher = n / (factor * 10); if (cur < 2) { count += higher * factor; if (cur == 1) count += lower+1; } else { count += (higher+1) * factor; } factor *= 10; } return (int) count; } };
相关文章推荐
- nginxlinux下虚拟主机设置
- [LeetCode]Implement Stack using Queues
- 计算阶乘
- 全选及全不选
- OpenJudge_P1808 公共子序列(DP)
- android camera系统3A模式及其状态转换(一)
- CSS基础要点概况
- android .9文件的一点处理
- 数据库(SQL)之触发器(trigger)中如何获取表中数据(使用局部变量)
- 如何配置svn服务器
- theano支持的数组、向量、矩阵表达式
- discuz微社区 始终显示“正在加载中”
- Mysql 5.7.9 安装错误小记
- 浅谈大型网站架构技术进化
- Android动画大总结
- 编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。
- 如何利用AngularJS打造一款简单Web应用
- 数据结构实验一(第3题)
- 《深入浅出Windows 10通用应用开发》
- 如何设置才能获得电脑蓝屏产生的转储文件啊