zoukankan      html  css  js  c++  java
  • 《剑指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;
    }
    
  • 相关阅读:
    java.lang.IllegalStateException: Failed to load ApplicationContext
    exit 和 return
    ORA-01031:insufficient privileges
    Errors running buider 'DeploymentBuilder' on project 'HFMS'
    unpack
    :Spring MVC +MyBatis +MySQL 登录查询Demo
    :Spring MVC +MyBatis +MySQL 登录查询Demo
    kill 某个进程
    10053 诊断事件
    11g 搜集直方图导致不走索引
  • 原文地址:https://www.cnblogs.com/echovic/p/6587167.html
Copyright © 2011-2022 走看看