1~n数字中1出现的个数

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~n数字中1出现的个数

同理,我们可以得到其他位数上的1出现的和
1~n数字中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;
    }
};

1~n数字中1出现的个数

上一篇:SOA与API的分裂和统一


下一篇:函数重载