您的位置:首页 > Web前端

剑指offer-整数中1出现的次数

2017-07-17 20:33 260 查看

问题

题目:[剑指offer-整数中1出现的次数]

思路

先用个简单的方法搞定,主要小心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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: