题目如下
思路与代码
前面两种是莽夫解法(面试一定凉)
1.字符串解法
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n) {
int ans=0;
for(int j=1;j<=n;j++){
string temp=to_string(j);
for(int i=0;i<temp.length();i++){
if(temp[i]=='1') ans++;
}
}
return ans;
}
};
2.数字解法(和1相似,只是不转字符串了)
public int NumberOf1Between1AndN_Solution(int n) {
int count=0;
for(int i=n;i>0;i--){
for(int j=i;j>0;j/=10){
if(j%10==1) count++;
}
}return count;
这里的j/=10还是很秀的
3.数学法(梦回高考)
看代码注释,你就懂了
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n) {
int count=0;//1的个数
int i=1;//当前位
int current=0,after=0,before=0;
while((n/i)!=0){
before=n/(i*10);//高位
current=(n/i)%10;//当前位
after=n-(n/i)*i;//低位
if(current==0){
//如果为0,由高位决定,等于高位数字*当前位数
count+=before*i;
}else if(current==1){
//如果为1,出现1的次数由高位和低位决定,高位*当前位+低位+1
count+=before*i+after+1;
}else if(current>1){
//如果大于1,出现1的次数由高位决定,(高位数字+1)*当前位数
count+=(before+1)*i;
}
//前移一位
i*=10;
}
return count;
}
};