1.暴力O(nlogk)
class Solution {
public:
int CountNum(int i)
{
int sum=0;
while(i)
{
if(i%10==1)
sum++;
i/=10;
}
return sum;
}
int NumberOf1Between1AndN_Solution(int n)
{
int count=0;
for(int i=1;i<=n;i++)
{
count+=CountNum(i);
}
return count;
}
};
2.参考编程之美 O(logn)
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int iCount = 0;
int iFactor = 1;
int low, curr, high;
while (n / iFactor)
{
low = n - (n / iFactor)*iFactor;
curr = (n / iFactor) % 10;
high = n/(iFactor*10);
switch (curr)
{
case 0:
iCount += high*iFactor;
break;
case 1:
iCount += high*iFactor + low + 1;
break;
default:
iCount += (high + 1)*iFactor;
break;
}
iFactor *= 10;
}
return iCount;
}
};
3.参考剑指offer O(logn)
class Solution {
public:
int Power10(int n)
{
int result=1;
for (int i = 0; i < n; i++)
{
result *= 10;
}
return result;
}
int NumberOf1Between1AndN_Solution(int n)
{
char strN[50]="";
sprintf(strN, "%d", n);
if (!strN || *strN == '\0' || *strN<='0' || *strN>'9')
return 0;
int len = strlen(strN);
int SecDfirstnum=0,Othernum=0,FistDnum=0;
int first = *strN-'0';
if (1 == first)
{
SecDfirstnum = atoi(strN+1)+1;
}
else
{
SecDfirstnum = Power10(len-1);
}
Othernum = first*(len - 1)*Power10(len - 2);
int m = atoi(strN + 1);
FistDnum = NumberOf1Between1AndN_Solution(m);
return SecDfirstnum + Othernum + FistDnum;
}
};