题解 | #整数中1出现的次数(从1到n整数中1出现的次数)#
整数中1出现的次数(从1到n整数中1出现的次数)
http://www.nowcoder.com/practice/bd7f978302044eee894445e244c7eee6
//eg:3140192 (注:看的别人题解的理解)
//此题只需关注数中的每一位都是为1的情况,然后累加起来就行
//记cur = 要算的某位位置 , cur左边记为a , cur右边记为b
//位上的数分为0 1 大于1 三种情况
//(1) cur = 0的情况,比如例子中千位的情况,
//如果万位上为1,那么cur左边只能是 0~313 , 右边是0~592 a=314 b=192
//那么此时 a*1000
//(2) cur = 1的情况,比如例子中百位的情况
// 又分为两种情况
// 第一种情况:左边为 0~3139 ,右边是0~99
// 第二种情况:右边为 3140 , 右边是0~92
// 综上为: a*100+1*(b+1)
//(3) cur>1 的情况,比如例子中十位的情况,
// 如果十位是1 , 那么就为 0~31401 右边是0—9
// 所以 (a+1)*10
public int NumberOf1Between1AndN_Solution(int n) {
int counts=0;
for (int m = 1; m <=n; m=m*10) {
int a=n/m, b=n%m;
counts+=(a+8)/10*m+(a%10==1 ? b+1 :0); //a%10表示上一位是否为1,为0?后一位为几就加几:0
}
return counts;
}
}