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.

題目只能通過尋找規律來實現。以2234爲列,我們可以分爲兩段計算,一段是1-234, 一段是235 - 2234,我們可以發現1-234其實求的是234前面的1的個數,也就是說我們可以遞歸的來求了。在求解235-2234的的1的個數時,1出現的地方分兩種情況,一個是出現在第一位,這種情況的話,要看第一位是不是1,如果第一位是1,那麼就可以是後面三位數字 +1;如果第一位不是1,那麼就是pow(10, len - 1); 這是1在第一位的情況,1在後面幾位的情況,我們可以用排列組合,可以知道其值爲: 第一位的值 * (len - 1) * pow(10, len - 2); 這樣分析之後,就可以快速的實現代碼了。

int countOne(string str)
    {
        int len = str.size();
        if(len == 0 || (len == 1 && str[0] == '0'))
            return 0;
        if(len == 1 && str[0] != '0')
            return 1;
            
        string tmpstr = str.substr(1, str.size() - 1);
        int numFirstDigit = 0;
        if(str[0] == '1')
        {
            numFirstDigit = atoi(tmpstr.c_str()) + 1;
        }
        else if(str[0] > '1')
        {
            numFirstDigit = pow(10.0, len - 1);
        }
        
        int numOtherDigit = (str[0] - '0') * (len - 1) * pow(10.0, len - 2);
        int numRecursive = countOne(tmpstr);
        return numFirstDigit + numOtherDigit + numRecursive;
    }
    int countDigitOne(int n) {
        if(n <= 0)
            return 0;
        return countOne(to_string(n));
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章