剑指 Offer 43. 1~n 整数中 1 出现的次数

剑指 Offer 43. 1~n 整数中 1 出现的次数

输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。

例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。

思路

对于每一位考虑1出现的个数,比如对于百位,从0 开始每1000个数字百位上的1都会出现100次。

对于数字 n ,百位上1的个数为:(n / 1000) * 100 + (n%1000 中百位1的个数)

  • n % 1000 < 100, 则为0
  • n % 1000 >= 100, < 200,则为 n % 100 - 100 + 1 次
  • n % 1000 >= 200,则为 100 次

上面的三个条件可以简写为 min(max(n%1000-100+1, 0), 100)

代码

class Solution {
public:
    int countDigitOne(int n) {
        long long mulk = 1;
        int ans = 0;
        for (int k = 0; n >= mulk; ++k) {
            ans += (n / (mulk * 10)) * mulk + min(max(n % (mulk * 10) - mulk + 1, 0ll), mulk);
            mulk *= 10;
        }
        return ans;

    }
};
posted @ 2022-04-28 15:23  沐灵_hh  阅读(23)  评论(0编辑  收藏  举报