• 《剑指offer》— JavaScript(31)整数中1出现的次数(从1到n整数中1出现的次数)


    整数中1出现的次数(从1到n整数中1出现的次数)

    题目描述

      求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。


    思路

    1. 设n=abcde,自右至左,从1开始标号。
    2. 如果第i位上的数字为0,则第i位可能出现1的次数由其高位决定,若没有高位,则视为0,此时第i位可能出现1的次数为:其高位数*10(i-1),例如若c为0,则次数为ab*102;
    3. 如果第i位上的数字为1,则第i位上可能出现1的次数受其高位和低位影响,若没有,则视为0,此时第i位可能出现1的次数:其高位数*10(i-1)+(低位数+1),例如若c为1,则次数为ab*102+(de+1);
    4. 如果第i位上的数字大于1,则第i位上可能出现1的次数受其高位影响,若没有,则视为0,此时第i位可能出现1的次数:(其高位数+1)*10(i-1),例如若c大于1,则次数为(ab+1)*102;

    实现代码

    function NumberOf1Between1AndN_Solution(n) {
        if (n < 0) return 0;
        var high, low, cur, temp, i = 1;
        high = n;
        var count = 0;
        while (high !== 0) {
            high = parseInt(n / Math.pow(10, i)); // 第i位数的高位
            temp = n % Math.pow(10, i);
            cur = parseInt(temp / Math.pow(10, i - 1)); // 第i位数
            low = temp % Math.pow(10, i - 1); // 第i位数的低位
            if (cur === 1) {
                count += high * Math.pow(10, i - 1) + low + 1;
            } else if (cur < 1) {
                count += high * Math.pow(10, i - 1);
            } else {
                console.log(count, high);
                count += (high + 1) * Math.pow(10, i - 1);
            }
            i++;
        }
        return count;
    }
    
  • 相关阅读:
    mac的端口被占用
    php中的运算符、控制结构
    文档模式影响浏览器的渲染
    ubuntu 命令 tips 来自于 ubuntu中文论坛
    用好 Emacs 中的 register
    [转载] Rsync命令参数详解
    使用 python 遍历目录下的文件
    灵活的左移位( << )操作
    使用 iperf 测试两台机器间的最大带宽
    Emacs server 新启动方式 (仅在emacs daemon未启动时才启动daemon)
  • 原文地址:https://www.cnblogs.com/echovic/p/6587167.html
Copyright © 2020-2023  润新知