233. Number of Digit One

public class Solution {
    public int countDigitOne(int n) {
        if(n<=0)return 0;
        return dfs(n);
    }
    private int dfs(int n){
        int length = size(n);


        if(length==1){
            if(n==0)return 0;
            else{
                return 1;
            }
        }
        if(length>1){
            int count=0;//首位一的个数
            int len = (n-(shengcheng(length-1)+1))/(shengcheng(length-1)+1);//shengcheng(length-1)+1,其实就是生成整跟n相同位数的整十数,如10,100,1000,10000000,

            int firstNum = n/(shengcheng(length-1)+1);
            int behindNum = n-firstNum*(shengcheng(length-1)+1);
            if (len>0)count=shengcheng(length-1)+1;
            else {
                count = n-(shengcheng(length-1)+1)+1;
            }
            return dfs(shengcheng(length-1))+len*dfs(shengcheng(length-1))+count+dfs(behindNum);
        }//比如321=dfs(99)+2*dfs(99)+100+dfs(21),dfs(1092)=dfs(999)+0*dfs(999)+92+dfs(92),那321来看最合适
        return 0;
    }
    public int size(int n){//测量数的位数
        int count = 1;
        while (n/10>0){
            n = n/10;

            count++;
        }
        return count;
    }
    public int shengcheng(int n){//生成99.999.9999这样的数三位就是999,4位就是9999
        int count=1;
        for(int i=0;i<n;i++)
            count  = count*10;
        return count-1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值