1~n数字中1出现的个数
LeetCode
给定一个整数 n
,计算所有小于等于 n
的非负整数中数字 1
出现的个数。
感觉挺有意思
对于一个数,我们先局部分析一下,比如123456,我们考虑百位这个位置上,1出现的个数,对于100~199中,1可以出现100次,对于我们这个数,有123个这样的循环,所以百位上的1有123 * 100,当然,这还不够完全,我们还要考虑余下的循环,也就是456这个数,对于这个数我们对100取余,假设取余结果为p
- 当p < 100时,我们容易知道,百位上不会出现1,
- 当p >= 100 & p < 200时,百位上应该有 p - 100 + 1个1出现
- 当p >= 200时,明显会把100个1全部出现
所以得到我们的公式
同理,我们可以得到其他位数上的1出现的和
typedef long long ll;
class Solution {
public:
int countDigitOne(int n) {
ll k = 1, res = 0;
while(n >= k){
res += (n / (k * 10)) * k + min(max(n % (k * 10) - k + 1, (ll)0), k);
k *= 10;
}
return res;
}
};