题目
方法一
将每个数字中的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;
}
};