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;
来源:牛客网