难度:中等

    题目描述:
    输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。

    例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。

    示例:

    1. 输入:n = 12
    2. 输出:5

    解题思路:
    归纳法,对于个位出现的1:(n / 10) 1 + (n % 10) > 1 ? 1 : 0;
    对于十位出现的1:(n / 100)
    10 + if (k > 19) 10 else if (k < 10) 0 else k - 10 + 1;
    对于百位出现的1:(n / 1000) 100 + if (k > 199) 100 else if (k < 100) 0 else k - 100 + 1;
    最终归纳出: (n / (i
    10)) i + if (k > 2 i - 1) i else if (k < i) 0 else k - i + 1, 其中k = n % (i * 10);

    1. var countDigitOne = function(n) {
    2. let count = 0;
    3. for (let i = 1; i <= n; i *= 10) {
    4. let divide = i * 10;
    5. let p = Math.floor(n / divide), k = n % divide, rest = 0;
    6. count += p * i;
    7. rest = (k > (2 * i - 1)) ? i : ((k < i) ? 0 : k - i + 1);
    8. count += rest;
    9. }
    10. return count;
    11. };