一二三四五 上山打老虎

Leetcode每日一题-2021-8-13<数字 1 的个数>(规律)

链接:https://leetcode-cn.com/problems/number-of-digit-one/

题意:给定数字n,计算所有小于等于n的非负数中1的个数和

思路:计算每一个位为1的情况,对于某位,numl-i-numr,numl是前缀,numr是后缀,计算i=1时前缀和后缀满足构成的数字小于n的种类数

对于前缀为[0,numl)时,i=1,则numr可以为任何数,若numr长度为m,numr10^m中,对应种类数为numl*10^m
对于前缀为numl时,就需要根据i的情况来判断i=1时的种类数
i==0 时,i不能为1,相应种类数为0
i==1 时,当i=1,相应种类数为numr+1(numr=0的情况)
i>1 时,当i=1numr可以为任何数 相应种类数为10^m

代码:

class Solution {
public:
    vector<int> ans;
    void cou(int x){//将数转为数组
        if(x<10){
            ans.emplace_back(x);
            return ;
        }
        cou(x/10);
        ans.emplace_back(x%10);
    }
    int countDigitOne(int n) {
        int res=0,atm=0;
        cou(n);
        int len=ans.size();
        for(int i=0;i<len;i++){
            int t=i+1;
            res+=(atm*pow(10,(len-t)));
            atm=atm*10+ans[i];
            if(ans[i]>1){
                res+=pow(10,len-t);
            }
            else if(ans[i]==1){
                res+=n-atm*pow(10,len-t)+1;
            }
            
        }
        return res;
    }
};
posted @ 2021-08-13 22:55  abestxun  阅读(48)  评论(0编辑  收藏  举报