233. Number of Digit One

Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.

For example:
Given n = 13,
Return 6, because digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.

class Solution {
public:
    int countDigitOne(int n) {
        /* 
            r表示当前位置上的数,res 表示当前位置之后的数,m表示当前的位数,ans表示最后的结果
            当前位置如果是0:则此时的种类数=该位置前的数(0,1,2,...,n-1)*m
            当前位置如果是1:则此时的种类数=该位置前的数(0,1,2,...,n-1)*m+该位置后的数+1(0,1,2,...,res)
            当前位置如果大于1:则此时的种类数=该位置前的数(0,1,2,...,n)*m
            以6102为例:
                第一个数是2:此时r=2,res=0,m=1,n=610
                    因为 2>1, 所以ans+=611;
                第二个数是0:此时r=0,res=2,m=10,n=61
                    因为0=0,所以ans+=61*10(因为当前位置为0,要计算当前位置为1的数的时候,前缀最大的数为601X,显然X可以取1到9)
                第三个数是1:此时r=1,res=02,m=100,n=6
                    因为1=1,所以ans+=6*100([0..5]1XX)+3([61XX]且XX<=02)
                第一个数是6:此时r=2,res=102,m=1000,n=0
                    因为 6>1, 所以ans+=1*1000(1XXX);
        */
        if(n<=0)return 0;
        int r,m=1,ans=0,res=0;
        do{
            r=n%10;
            n=n/10;
            if(r==0)ans+=n*m;
            else if(r==1)ans+=n*m+(res+1);
            else ans+=(n+1)*m;
            res=r*m+res;
            m=m*10;
        }while(n);
        return ans;
    }
};

 

posted @ 2017-03-28 21:44  Tsunami_lj  阅读(99)  评论(0编辑  收藏  举报