爱问面试题 牛客网: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的情况,
如果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(注意这里是十位,其他位不考虑)。
如果w十=2,那么十位上出现2的次数为hig*10+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。

**`然后要把这个规律运用到各个位置上`**

方法一:if条件语句进行判断
public class Count2 {
public int countNumberOf2s(int n) {
int high=0;
int low=0;
int count=0;
int cur=0;
int sum=0;
int factor=1;//从个位开始向高位走 个->十->百->千->万
while(n/factor!=0){ // =0是factor超过了N
cur=(n/factor)%10;
high=n/(factor10);
low=n-(n/factor)
factor;
if(cur<2){//只可能有一种情况
count+=high*factor;

        }
        if(cur==2){
            count+=high*factor+1+low;

        }
        if(cur>2){
            count+=(high+1)*factor;

        }
        factor=factor*10;
        //sum=sum+count;
    }
    return count;

}
}

方法2:
switch case分支语句

public class CountOf2 {

    public int countNumberOf2s(int n) {
        int iCount=0;
        int iFactor=1;
        int iLowerNum=0;
        int iCurrNum=0;
        int iHigherNum=0;
        while(n/iFactor!=0){
            iLowerNum=n-(n/iFactor)*iFactor;
            iCurrNum=(n/iFactor)%10;
            iHigherNum=n/(iFactor*10);

            switch(iCurrNum){
                case 0:
                    iCount+=iHigherNum*iFactor;
                    break;
                case 1:
                    iCount+=iHigherNum*iFactor;
                    break;
                case 2:
                    iCount+=iHigherNum*iFactor+iLowerNum+1;
                    break;
                default:
                    iCount+=(iHigherNum+1)*iFactor;
                    break;
            }
            iFactor*=10;
        }
        return iCount;
    }

}

猜你喜欢

转载自blog.51cto.com/14232658/2477303
今日推荐