剑指offer----整数中1出现的次数(从1到n整数中1出现的次数)

题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

class Solution {
public:
//N为9或者99或者999.....
    int cal_way(int N)
    {
        if(N/10==0)return 1;
        return 10*cal_way(N/10)+N/10+1;
    }
    int NumberOf1Between1AndN_Solution(int n)
    {
        if(n==0)return 0;
        if(n<10)return 1;
        string temp=to_string(n);
        int mark_n=1;
        int mark_i=temp.size()-1;
        while(mark_i>0)
        {
            mark_n*=10;
            mark_i--;
        }
        int value=cal_way(mark_n-1);
        int the_number=n/mark_n;
        int res=0;
        //只有开通为1的时候不同0,2-9的1的个数都相等,例如000-099等于200-299
        if(the_number>=2)
        {
            res=the_number*value+mark_n+NumberOf1Between1AndN_Solution(n%mark_n);
        }
        //递归思想
        else
        {
            res=value+NumberOf1Between1AndN_Solution(n%mark_n)+n%mark_n+1;
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/xiaocongcxc/article/details/82634779
今日推荐