特别注意这道题的意思是'1'这个数出现的次数,就是1、10、11算作4次而不是3次,想通这一点就很好解决
分别计算位于每一位中出现1的次数,根据前后位数字找规律就好
public 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){
current = (n / i) % 10; // 当前位数字
before = n / (i * 10); //高位数字
after = n - (n / i) * i; //低位数字
//如果为0,出现1的次数由高位决定,等于高位数字 * 当前位数
if (current == 0)
count += before * i;
//如果为1,出现1的次数由高位和低位决定,高位*当前位+低位+1
else if(current == 1)
count += before * i + after + 1;
//如果大于1,出现1的次数由高位决定,//(高位数字+1)* 当前位数
else{
count += (before + 1) * i;
}
//前移一位
i = i * 10;
}
return count;
}
}