您的位置:首页 > Web前端 > JavaScript

[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);
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: