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;
    }
    
  • 相关阅读:
    谷歌json数据格式化插件
    引用图片出现403的解决办法
    CSS Sprite
    语义化标签
    响应式布局
    CSS浮动布局详解
    ELK华为云的镜像下载地址(ElasticSearch,logstash,kibana)
    redis集群方案--高可用集群
    redis集群方案--哨兵模式
    Redis集群实现分布式锁-RedLock
  • 原文地址:https://www.cnblogs.com/echovic/p/6587167.html
Copyright © 2011-2022 走看看