输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
leetcode
解题思路:依次遍历每一个位的情况。即统计,小于当前数字的数中,每一个位为1的数量。
- 当前位是0:则不存小于去掉高位,当前位还有1存在的情况,所以,只需要统计高位存在的时候,当前位存在1的情况。至于为什么是加上高位的数字值,因为当前位为1的是的数量就是高位的数值啊。
- 当前位是1:首先可以加上当前位是0的情况高位的值,因为当前为是0肯定小于是1的情况。然后加上低位的值,原理和上面一样。至于为什么要加1,就是加上了当前位为1,高位的值为0的情况。
- 当前位大于1:数量只由高位决定,因为在当前位是1的情况下,低位可以填满,填满了都不会大于整体的数值,而上面一种情况,不能填满,填满了就超了。
class Solution {
public int countDigitOne(int n) {
int res = 0;
long i = 1;
while(n / i > 0) {
long high = n / (i * 10);
long cur = (n / i) % 10;
long low = n - high * 10 * i - cur * i;
if(cur == 0) res += high * i;
else if(cur == 1) res += high * i + low + 1;
else res += high * i + i;
i *= 10;
}
return res;
}
}