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; } };