2的个数(牛客)

题目来源

2的个数

题目描述

请编写一个方法,输出0到n(包括n)中数字2出现了几次。
给定一个正整数n,请返回0到n的数字中2出现了几次。
在这里插入图片描述

题目解析

可以推出规律:
为了计算每个位w上出现多少个2,可以将数字分成三段,w位的值,高于w位的hig和低于w位的low。例如计算1231的十位上出现多少个2时,w=3,hig=12,low=1。
为什么这样分呢,主要是因为每个位上出现2的次数不仅和当前位的数字有关,也和hig和low有关。理由如下:仍然讨论十位上出现多少个2的情况,
如果w<2,那么十位上出现2的次数为hig10。例如1211,十位上有2的数是20,21,22,23…29(十个),120,121,122…129(十个),220,221,222…229(十个)…1120,1121…1129(十个),所以十位上出现2的次数为hig10(注意这里是十位,其他位不考虑)。
如果w=2,那么十位上出现2的次数为hig10+low+1。例如1221,这时除了小于2情况下的数,low=1,还会多出1220,1221,加一的原因是从0开始的。
如果w>2, 这样就明显了,出现2的次数为(hig+1)10,可以自己推导下。
进而把这个规律推导到百位,w百 < 2, hig
100;w百 = 2, hig
100 + low+1;w百 > 2, (hig+1)*100。
但是有特例:个位时,low要赋值为0,因为没有比个位更低的位了。最高位时,hig本身就是0。

题目解答

import java.util.*;

public class Count2 {
    
    
    public int countNumberOf2s(int n) {
    
    
        int count=0;//记录最后出现2的个数
        int flag=1;//标记个位数1,十位数10,百位数100
        int low=0;//比当前位低的数值
        int high=0;//比当前位高的数值
        int current=0;//当前位上的数
        while(n/flag!=0){
    
    
            low=n-(n/flag)*flag;
            current=(n/flag)%10;
            high=(n/flag)/10;
            if(current==0||current==1){
    
    
                count+=high*flag;
            }else if(current==2){
    
    
                count+=high*flag+low+1;
            }else{
    
    
                count+=(high+1)*flag;
            }
            flag*=10;
        }
        return count;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44929652/article/details/107532558
今日推荐