题目:
输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。
思路:
从最低位到最高位分开计算。
假如要计算百位上1出现的次数由高位的数字,低位的数字,百位以上的数字。
- 若百位上数字为0,百位上可能出现1的次数由高位决定。比如:2013,百位出现1的情况:100199,11001199,一共200个。结果等于更高位数字乘以当前位数。即2*100 。
- 如果百位上数字为1,百位上可能出现1的次数受高位和低位影响。比如:2113,受高位影响的情况是:100199,11001199,21002113。等于高位数字乘以当前位数2*100。受低位影响,百位出现1的情况是:21002113,一共114个,等于低位数字113+1。
- 如果百位上数字大于1,则百位上出现1的情况仅由更高位决定,比如2213,则百位出现1的情况是:100199,11001199,2100~2199,等于高位数字+1乘以当前位数(2+1)*100。
代码:
public static int NumberOf1Between1AndN_Solution(int n) {
int count = 0;
for (int i = 1; i <= n; i *= 10) { //i代表位数
int high = n / (i * 10); //更高位数字
int low = (n % i); //更低位数字
int cur = (n / i) % 10; //当前位数字
if (cur == 0) {
count += high * i;
} else if (cur == 1) {
count += high * i + (low + 1);
} else {
count += (high + 1) * i;
}
}
return count;
}