剑指 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;
}
};
欢迎转载,转载请注明出处!