牛客_整数出现1的次数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangvalue/article/details/87951968

题目描述

求出任意非负整数区间中1出现的次数(从1 到 n 中1出现1的次数)

分析:

单独考虑每一位数上产生1的情况最后累加汇总
设N = abcde ,其中abcde分别为十进制中各位上的数字。 如果要计算百位上1出现的次数,它要受到3方面的影响:当前位数百位上的数字,百位以下(低位)的数字,百位以上(高位)的数字。

(下面的举列子只是以百位为例子其他位同样的道理)

例如:12113当取到百位current=1,高位记为before=12,低位记为after=13


current=0

 如果百位上数字为0,百位上可能出现1的次数由更高位决定。因为这个时候就是百位为1说明前面位数一定不能为0,在考虑当前位为1的时候,比如百位,那就是从100-199一共有(199-100+1)=100,前面位数不为0一共有before种,所以before*100。

比如:12013,则可以知道百位出现1的情况可能是:100~199,1100~1199,2100~2199,,...,11100~11199,一共1200个。可以看出是由更高位数字(12)决定,并且等于更高位数字(12)乘以 当前位数(100)。


 current=1

如果百位上数字为1,百位上可能出现1的次数不仅受更高位影响还受低位影响。

既然受到前面位数的影响说明前面位数before肯定不能为0,如果前面位数为0那么就说明是不受前面位数影响就换成了受到后面位数影响了,受到前面位数影响为 before*100,当受到后面位数影响的时候此时before就取0,此时后面的位数可以为0,因为是在后位可以取到0,所以就是(after-0+1),所以最终就是  (before)*100+(after-0+1)

比如:12113,则可以知道百位受高位影响出现的情况是:100~199,1100~1199,2100~2199,,....,11100~11199,一共1200个。和上面情况一样,并且等于更高位数字(12)乘以 当前位数(100)。但同时它还受低位影响,百位出现1的情况是:12100~12113,一共114个,等于低位数字(113)+1。


current>1

如果百位上数字大于1(2~9),则百位上出现1的情况仅由更高位决定。因为考虑只是每一位的情况,就是当前位取1的时候,是不受高位影响的(和第一种情况有一点区别就是百位为1此时高位取0也是可以的)就是(before-0+1)*100

比如:12213,则百位出现1的情况是:100~199,1100~1199,2100~2199,...,11100~11199,12100~12199,一共有1300个,并且等于更高位数字+1(12+1)乘以当前位数(100)。


/**
 * @ Author zhangsf
 * @CreateTime 2019/2/26 - 5:40 PM
 */
package com.bjut;

public class NumberOf1Between1AndN_Solution {
    public static void main(String[] args) {
        System.out.println("测试数据123中"+NumberOf1Between1AndN_Solution(123));
    }
    public static int NumberOf1Between1AndN_Solution(int n) {
        int count = 0;//1的个数
        int i = 1;//当前位
        //定义三个int类型的,一个作为当前的位current,一个作为n在当前位的前面的数字before,一个作为n当前位的后面的数字after
        int current = 0,after = 0,before = 0;
        //循环结束的条件是当n的各个位都遍历了
        while((n/i)!= 0){
            current = (n/i)%10; //高位数字
            before = n/(i*10); //当前位数字
            after = n-(n/i)*i; //低位数字
            //如果为0,出现1的次数由高位决定,等于高位数字 * 当前位数
            if (current == 0)
                count += before*i;
                //如果为1,出现1的次数由高位和低位决定,高位*当前位+低位+1
            else if(current == 1)
                count += before * i + after + 1;
                //如果大于1,出现1的次数由高位决定,//(高位数字+1)* 当前位数
            else{
                count += (before + 1) * i;
            }
            System.out.println("输入的元素"+n+"---当前的位数----"+i+"位---current位---"+current+"---before位---"+
                    before+"---after---"+after+"---当前位产生的count有---"+count);
            //前移一位
            i = i*10;
        }
        return count;
    }
}

猜你喜欢

转载自blog.csdn.net/zhangvalue/article/details/87951968
今日推荐