传送门:https://leetcode-cn.com/problems/number-of-digit-one/
一、题目描述
给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
二、示例
输入: 13
输出: 6
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。
三、分析
思路:分别对每一位统计,即个位、十位、百位…
eg:给定数字 n=abcde ,分析百位 c,可分以下三种情况:
c=0时,比如53015,此时百位出现1的是 00100 -00199,01100-01199,…,53100-53199,共 53 × 100 = 5300 53\times100=5300 53×100=5300 个。个数由高位数字决定,并受当前位数的影响。c=1时,比如53115,此时百位出现1包括c=0的情况,另外还需考虑低位的情况53100-53115共116个。c>=2时,比如53215,共 54 × 100 = 5400 54\times100=5400 54×100=5400 个。个数由高位数字决定(高位+1),并乘以当前位数。
四、实现
class Solution {
public:
int countDigitOne(int n) {
int count = 0;
long factor = 1;
long lower = 0, cur = 0, higher = 0;
while(n / factor != 0)
{
lower = n % factor;
cur = (n / factor) % 10;
higher = n / (factor * 10);
if(cur < 2)
{
count += higher * factor;
if(cur == 1)
count += lower + 1;
}
else {
count += (higher + 1) * factor;
}
factor *= 10;
}
return count;
}
};

本文探讨了LeetCode上一道经典题目:计算小于等于n的所有非负整数中数字1出现的总次数。通过详细解析算法思路,分享了一种高效求解的方法。文章通过实例解释了如何针对不同位数进行统计,提供了清晰的代码实现。

495

被折叠的 条评论
为什么被折叠?



