【LeetCode】233. Number of Digit One
2015-07-13 12:26
555 查看
Number of Digit One
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.
Hint:
Beware of overflow.
难题的惯例是先上保底做法。逐个数字数1,累加。
虽然知道会TLE,总比空着白板好。
下面上标准做法,参考了编程之美。
这题可以扩展为其他进制的情况。
从右到左逐位计数当前位置(记为cur)为1的所有数字。
(1)cur为0时,需要计数的部分为:cur位置为1,然后对于高位0~high-1的每个值,低位遍历0~divisor。
因此总数为high * divisor
(2)cur为1时,需要计数的部分为:除了上述cur为0的部分,再补充cur为1时,低位遍历0~low。
因此总数为high * divisor + low + 1
(3)cur为其他数时,需要计数的部分为:
cur位置为1,然后对于高位0~high的每个值,低位遍历0~divisor。
因此总数为(high + 1) * divisor
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.
Hint:
Beware of overflow.
难题的惯例是先上保底做法。逐个数字数1,累加。
虽然知道会TLE,总比空着白板好。
class Solution { public: int countDigitOne(int n) { int ret = 0; if(n <= 0) return ret; for(int i = 1; i <= n; i ++) { ret += countOne(i); } return ret; } int countOne(int n) { int ret = 0; while(n) { if(n % 10 == 1) ret ++; n /= 10; } return ret; } };
下面上标准做法,参考了编程之美。
这题可以扩展为其他进制的情况。
从右到左逐位计数当前位置(记为cur)为1的所有数字。
(1)cur为0时,需要计数的部分为:cur位置为1,然后对于高位0~high-1的每个值,低位遍历0~divisor。
因此总数为high * divisor
(2)cur为1时,需要计数的部分为:除了上述cur为0的部分,再补充cur为1时,低位遍历0~low。
因此总数为high * divisor + low + 1
(3)cur为其他数时,需要计数的部分为:
cur位置为1,然后对于高位0~high的每个值,低位遍历0~divisor。
因此总数为(high + 1) * divisor
class Solution { public: int countDigitOne(int n) { if(n <= 0) return 0; int ret = 0; int base = 10; long long divisor = 1; while(n / divisor) { int high = n / (divisor * base); int cur = n / divisor % base; int low = n - n / divisor * divisor; if(cur == 0) ret = ret + high * divisor; else if(cur == 1) ret = ret + high * divisor + low + 1; else ret = ret + (high + 1) * divisor; divisor *= base; } return ret; } };
![](http://images0.cnblogs.com/blog2015/458814/201507/131220149541594.jpg)
相关文章推荐
- 12.Java5读写锁技术的妙用
- POJ 2828 Buy Tickets(线段树·插队)
- 安卓
- windows 10预览版怎么启用零售模式?
- linux Apache支持asp配置
- java中的注解
- Android 4中点击事件写法
- 一、初级篇——指针(*)、取地址(&)、解引用(*)与引用(&)的区别
- centos安装apache
- 火狐浏览器3.0如何查看网页元素的三维视图
- bzoj3242: [Noi2013]快餐店 树形dp+线段树
- HDU 3584 Cube(三维树状数组)
- 二叉树的建立和遍历
- 分类器总结
- HSL模型与填色的应用
- hdu 1026 bfs+优先级队列
- J2EE的13种核心技术
- uiscrollview 无缝循环滚动
- 强制360,webkit内核浏览器显示兼容模式
- .Net学习笔记----2015-07-13(HTML表格)