原题
题解
方法一
参照类似 233.数字1的个数 的解题法
本思路java及代码示例:
/*
*@v7fgg
*执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户
*内存消耗 :36.4 MB, 在所有 Java 提交中击败了100.00%的用户
*2020年6月17日 8:59
*/
class Solution {
public int numberOf2sInRange(int n) {
int ans=0;
int pOf10=1;
int m=n;//复制一个n,因为后面几轮循环后还会涉及到n的原始值
while(m>0){
ans+=m%10!=2?(m+8)/10*pOf10:m/10*pOf10+(n%(pOf10*10))-2*pOf10+1;
pOf10*=10;
m/=10;
}
return ans;
}
}
方法二 暴力(超时)
class Solution {
public int numberOf2sInRange(int n) {
int ans=0;
for(int i=2;i<=n;i++){
ans+=nOf2(i);
}
return ans;
}
public int nOf2(int m){
//计算数字m的十进制表达里面有几位是2
int c=0;
while(m>0){
c+=m%10==2?1:0;
m/=10;
}
return c;
}
}
//23 / 44 个通过测试用例 状态:超出时间限制
//最后执行的输入:559366752
//测试例:27000000 答案:26200001 用时:1842 ms
//2020.06.17