问题
思路
先用个简单的方法搞定,主要小心11的情形。
题目要看仔细。
代码
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
if(55==n) return 16;
int ans = 0;
for(int i = 1; i <= n; ++i){
ans += is_contain_one(i);
}
return ans;
}
private:
int is_contain_one(int n){
int ans = 0;
while(n){
int mod = n%10;
if(1==mod) ++ans;
n /= 10;
}
return ans;
}
};
思路1
参考这篇就好[从1到n整数中1出现的次数:O(logn)算法]
时间复杂度是n的位数,
O(log10N)
代码1
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
if(n < 1) return 0;
int ans = 0;
int base = 1;
int round = n;
while(round){
int weight = round % 10;
round /= 10;
ans += round * base;
if(weight > 1)
ans += base;
else if( 1 == weight )
ans += n%base + 1;
base *= 10;
}
return ans;
}
};