Java编程题:2的个数

2的个数

请编写一个方法,输出0到n(包括n)中数字2出现了几次。
给定一个正整数n,请返回0到n的数字中2出现了几次。

测试样例:
10
返回:
1

解析:
可以推出规律:
为了计算每个位w上出现多少个2,可以将数字分成三段,当前w位,高于w位的hig和低于w位的low。例如计算1231的十位上出现多少个2时,w(十位)=3,hig=12,low=1。为什么这样分呢,主要是因为每个位上出现2的次数不仅和当前位的数字有关,也和hig和low有关。

拿十位上出现多少个2进行举例,下面分三种情况:
(1)如果w(十位)<2,那么十位上出现2的次数为hig*10。例如1211,十位上有2的数是:
20,21,22,23…29(十个),
120,121,122…129(十个),
220,221,222…229(十个)

1120,1121…1129(十个),所以十位上出现2的次数为hig*10(注意这里是十位,其他位不考虑)。

(2)如果w(十位)=2,那么十位上出现2的次数为hig*10+low+1。
例如1221,
20,21,22,23…29(十个),
120,121,122…129(十个),
220,221,222…229(十个),

1120,1121…1129(十个),
1220,1221(2个),这时除了w(十位)<2情况下的数,还要考虑到low的取值,此处low=1,因此多出了1220,1221,加一的原因是要考虑到0的情况。

(3)如果w(十位)>2, 这样就明显了,出现2的次数为(hig+1)*10。
例如1231:
20,21,22,23…29(十个),
120,121,122…129(十个),
220,221,222…229(十个),

1120,1121…1129(十个),
1220,1221…1229(十个),w(十位)>2时,1220,1221…1229(十个)是完整的,不需要再考虑low低位的情况。

同理这个规律也可以推导到百位,
w(百位)< 2, hig*100;
w(百位) = 2, hig*100 + low+1;
w(百位)> 2, (hig+1)*100。

但是有特例:个位时low==0,因为没有比个位更低的位了,最高位时hig==0

import java.util.*;
import static java.lang.Math.pow;
public class Count2 {
    public int countNumberOf2s(int n) {
        int hig, w, low,i=-1;  //i等于-1是因为do...while的原因
        int result = 0;
        do{
            i++;
            int m=(int)pow(10,i);
            hig = n/m;
            w = hig%10;
            hig/=10;

            if(i == 0){
                low=0;
            } else{
                low=n%m;
            }

            if( w < 2){
                result+=hig*pow(10,i);
            }else if( w == 2){
                result+=hig*pow(10,i)+low+1;
            }else{
                result+=(hig+1)*pow(10,i);
            }

        }while(hig != 0);
        //这里用do...while是因为最高位也需要被计算,即使它的hig为0.
        return result;
    }
}

注意:

  • 静态导入:import static java.lang.Math.pow;

来源:牛客网

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值