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


    offer_31

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

    题目描述

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

    • 思路分析:
    • 0-9 为一个循环,出现1的次数为1次,
    • 如果当前值为1
      • 说明多出现了 当前值的 后面的数字+1次
        • 比如11 先出现10*权值(1)次,也就是0-9循环了10次;
        • 然后当前值为个位的1,需要再加 后面的数字+1次,也就是 0 +1 ;所以总的次数就是11次
    • 如果当前值大于1
      • *说明多出现了 当前值的 权值 *1次
        • 比如12 先出现10*权值(1)次,也就是0-9循环了10次;
        • 然后当前值为个位的2,需要再加 当前值的 权值 *1次 ,也就是 1 +1 ;所以总的次数就是12次
    • 提出公共部分 ”先出现10*权值(1)次“放在最前面

    代码实现:

    public class Solution {
        
     public int NumberOf1Between1AndN_Solution(int n) {
    
        int cur;			//每轮循环求cur位置上的1的个数
        int result = 0;		//统计出现的总次数
        int mul = 1;		//用来记录cur位置处于那个位置,个位,十位,百位...也就是权值
        int input = n;		//保存输入,便于取到当前位置后面的的数值   例如123 当前是1,为了取到23
        int target = 1;		//取值1-9,表示求的target出现的个数,如本题为1
    
        while (n != 0) {//把当前值的最高位查完 如123
            cur = n % 10;//取出最后一位 3
            n /= 10;//剩下的数字12
    
            result += n * mul; // 12 *1+0   就是当前位置 前面的数字 乘以当前位置的权值,代表转了多少圈,毕竟都是0-9累加的,前面数字多少就代表走了多少圈,也就是多少个1
    
            if (cur > target) {// 3 >1如果当前值比1大,就说明多了一次,比如123 当前是3   是比1大,说明多出现了一次,这个一次就例如 1
                result += 1 * mul; //权值*1加上之前的值
            }
            else if (cur == target) {//如果当前值等于一,说明出现了当前值后面的数字次1还要加1次
                result += input % mul + 1;
            }
    
            mul *= 10;
        }
    
        return result;
    }
    
        
    }
    
  • 相关阅读:
    Nginx配置文件
    SSM三层模型之间的参数传递
    Junit4用法
    常量类的设计
    初识Oracle
    sss
    sss
    sss
    sss
    sss
  • 原文地址:https://www.cnblogs.com/SunAlbert/p/13485013.html
Copyright © 2020-2023  润新知