题目分析:[[EVD]] - 剑指 Offer 43. 1~n 整数中 1 出现的次数
https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/
简单描述:
- 输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
- 例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
限制🚫
- 1 <= n < 2^31
示例:
输入:n = 12
输出:5输入:n = 13
输出:6
解题思路:
思路:
- #数学 固定一位,按位统计,划分两个部分,前部和包含当前位的后部,后部通过min(max(n-k+1,0),k)统计
-
借用大佬图片,如有侵权请联系我删除 -
借用大佬图片,如有侵权请联系我删除 -
借用大佬图片,如有侵权请联系我删除
效率:
- 时间复杂度
**⚠️n的位数**
- 空间复杂度
代码:
class Solution
{
public:
/*固定一位计算,即按位计算
例如:1234,个位含1:124(123+1),十位含1:130(120+10),
百位含1:200(100+100),千位含1:235(0+235)*/
int countDigitOne(int n)
{
long long k = 1;
int res = 0;
while (n >= k)
{
res += n / (k * 10) * k /*固定位前高位统计*/ + min(max(n % (k * 10) - k + 1, 0LL), k) /*含固定的低位统计*/;
k *= 10;
}
return res;
}
};