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

来源:互联网 发布:如何绕过网络限制 编辑:程序博客网 时间:2024/05/22 10:55

问题

题目:[剑指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;    }};
阅读全文
0 0
原创粉丝点击