[LeetCode][JavaScript]Number of Digit One
2015-07-08 23:46
741 查看
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.
数学题,真是为难了数学拙计的我了。
递归分治,每一轮递归都会减少一位,拿8192举栗子:
把8192拆成:
1-999 -> 递归(999)
1000-1999 -> 1000个1 + 递归(999)
2000-2999 -> 递归(999)
.
.
7000-7999 -> 递归(999)
8000-8192 -> 递归(192)
总数是:递归(999)*8 + 1000 + 递归(192)
要注意到如果是1192
总数是:递归(999)*1 + (1000 - 192 + 1) + 递归(192)
(1000 - 192 + 1)是1000-1192中千分位上的1。
https://leetcode.com/discuss/44496/5lins-solution-using-recursion
The concept is count 1s in current level, recursively do it until the number is smaller than 10.
For example '8192':
1-999 -> countDigitOne(999)
1000-1999 -> 1000 of 1s + countDigitOne(999)
2000-2999 -> countDigitOne(999)
.
.
7000-7999 -> countDigitOne(999)
8000-8192 -> countDigitOne(192)
Count of 1s : **countDigitOne(999)*8 + 1000 + countDigitOne(192)**
**Noticed that**, if the target is '1192':
Count of 1s : **countDigitOne(999)*1 + (1192 - 1000 + 1) + countDigitOne(192)**
(1192 - 1000 + 1) is the 1s in thousands from 1000 to 1192.
/** * @param {number} n * @return {number} */ var countDigitOne = function(n) { if(n <= 0){ return 0; }else if(n < 10){ return 1; } var len = n.toString().length; var base = Math.pow(10, len - 1); var answer = parseInt(n / base); var remainder = n % base; var oneInBase = 0; if(answer === 1){ oneInBase = n - base + 1; }else{ oneInBase = base; } return countDigitOne(base - 1) * answer + oneInBase + countDigitOne(remainder); };
然后少开几个变量,强行把代码写在一行上,在实际项目中不要这么做哦,过段时间自己也读不懂了。
/** * @param {number} n * @return {number} */ var countDigitOne = function(n) { if(n <= 0) return 0; if(n < 10) return 1; var base = Math.pow(10, n.toString().length - 1); var answer = parseInt(n / base); return countDigitOne(base - 1) * answer + (answer === 1 ? (n - base + 1) : base) + countDigitOne(n % base); };
相关文章推荐
- NSJSONReadingMutableContainers NSJSONReadingMutableLeaves
- js方法fromCharCode()实现中文字输出
- 给Magento新增JSON-RPC类型的Api适配器(adapter)
- jsp (五) <jsp:useBean> scope
- js遇到这样基础题,看你能不能作对呢
- javascript实时保存时出现修改多条记录的bug
- HTML 调用JavaScript脚本
- JSONModal 的使用
- 为什么JSP会比Beetl慢
- JavaScript之包装对象
- IE浏览器开启对JavaScript脚本的支持
- js调用后台,后台调用前台等方法总结
- Javascript学习笔记
- js使用cookies的例子
- 我所了解的JavaScript糟粕和鸡肋
- Understanding JavaScript is Vitally Important
- javascriptEvent对象
- javascript字符串对象
- javascript事件
- 时间久了基础都忘了吧,来回顾一下javascript节点吧!