233. Number of Digit One leetcode

来源:互联网 发布:sql select 中文 编辑:程序博客网 时间:2024/05/21 10:34

看了网上的文章,写的一点都不简洁,还是自己写的代码好懂

class Solution {
public:
    int countDigitOne(int n) {
        vector<int> v;

//先将n的数字分割开
        while(n)
        {
            v.push_back(n%10);
            n/=10;
        }
        int vn=v.size();
        int sum=0;

//根据分割开的数字a进行判断,如果不是1的话,则该位置上的1的个数为pow(10,i);

//如果是1的话就是后面几位的数的和,比如154,则在百位上1的个数就是54+1,但是这里会漏掉一些1,

//举个例子吧,比如21345,我先计算的是1~20000之间的1的个数,是10000+2*10000(个位上)+200*100(百位)+20*1000(千位)(因为为1的时候有10个,为2的时候有10个)

//然后是1345,首先得加上千位上的346个+999+345的1的个数
        for(int i=vn-1;i>=0;i--)
        {
            
            if(v[i]>1)
            {
                sum+=pow(10,i);
                int j=i;
                while(j--)
                {
                    sum+=pow(10,i-1)*v[i];
                }
            }
            if(v[i]==1)
            {
                sum++;
                int x=0;
                int y=0;
                for(int j=0;j<=i-1;j++)
                {
                    x+=v[j]*pow(10,j);
                    y+=9*pow(10,j);
                }
                sum+=x;
                sum+=countDigitOne(y);
            }
            
        }
        return sum;
    }
};

0 0
原创粉丝点击