LeetCode 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.

思路: 按位dp。

1、先算出每个数量级的1的个数,简单dp。

2、从高位到地位处理。利用数量级和边界算出。 注意每一位上为0的情况。

 

时间久不刷题,手太生了。

AC代码:

class Solution {
public:
    int countDigitOne(int n) {
        if(n <= 0) return 0;
        
        long long f[16] = {0}, ex[16] = {0};
        long long cur = 10;
        f[1] = 1;
        ex[0] = 1;
    
        for(int i=2; i<16; i++)
        {
            ex[i-1] = ex[i-2]*10;
            f[i] = f[i-1]*10;
            f[i] += cur;
            cur *= 10;
        }
        
        long long ans = 0;
        vector<int>tp;
        int m = n;
        while(n)
        {
            tp.push_back(n%10);
            n/=10;
        }
        for(int i=tp.size()-1; i>=0; i--)
        {
            if(tp[i]> 1)
            {
                ans += tp[i]*f[i];
                ans += ex[i];
            }
            else if(tp[i] == 1)
            {
                ans += tp[i]*f[i];
                ans += m%ex[i]+1;
            }
        }
        return ans;
    }
};

 

   

posted @ 2016-04-12 22:07  Gu Feiyang  阅读(131)  评论(0)    收藏  举报