题目

方法一
将每个数字中的1的个数进行相加,最终的结果就是1出现的总的次数。但是这种方法的效率较低,时间复杂度为
O
(
n
∗
l
o
g
n
)
O(n*log_n)
O(n∗logn),当n非常大的时候,需要大量的计算。
代码:
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
if(n<=0)
return 0;
int sumOfOne=0;
//注意边界条件:起始是从1开始的
for(int i=1;i<=n;++i)
{
sumOfOne+=NumOfOne(i);
}
return sumOfOne;
}
int NumOfOne(int n)
{
int everyCount=0;
// 求每个数字中有多少个1
while(n)
{
if(n%10==1)
++everyCount;
n/=10;
}
return everyCount;
}
};
方法二:
1、分析
可以根据
n
n
n 中的每一位数字来判断包含1的个数。n 包含
l
o
g
n
logn
logn位数。
解题思路
2、代码
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int count = 0;
long long i = 1;
for(i = 1; i <= n; i *= 10)
{
//i表示当前分析的是哪一个数位
int a = n / i, b = n % i;
count = count + (a + 8) / 10 * i + (a % 10 == 1) * (b + 1);
}
return count;
}
};
本文介绍两种高效算法,用于计算从1到任意正整数N中数字1出现的总次数。第一种方法通过累加每个数字中1的数量实现,尽管直观但效率不高。第二种方法利用数学分析,通过遍历每一位数来统计包含1的个数,提供了一种更优的时间复杂度解决方案。

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



