題目
方法一
將每個數字中的1的個數進行相加,最終的結果就是1出現的總的次數。但是這種方法的效率較低,時間複雜度爲 ,當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、分析
可以根據 中的每一位數字來判斷包含1的個數。n 包含 位數。
解題思路
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;
}
};