劍指Offer(牛客版)--面試題43: 1~n 整數中 1 出現的次數

題目描述:

 

輸入一個整數n,求從1到n這n個整數的十進制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。

 

完整代碼:

 

class Solution {
public:
    
    int NumberOf1Between1AndN_Solution(int n)
    {
         //檢查輸入的合法性
         if(n <= 0)
             return 0;
        //聲明一個變量,用來存放數字
         char array[50];
        //將整數轉換成字符串
        sprintf(array,"%d",n);
        //返回 1 的出現正數
        return Numbersof1(array);
    }
private:
    //統計 1 出現的次數
    int Numbersof1(const char* array)
    {
        //檢查輸入的合法性
        if(!array || *array < '0'|| *array > '9'|| *array == '\0' )
            return 0;
        //計算開頭的第一個數字
        int first = *array - '0';
        //計算 array 的長度 
        unsigned int length = static_cast<unsigned int> (strlen(array));
        //計算單個數字0的情況
        if(length == 1 && first == 0)
            return 0;
        //計算單個數字非 0 的情況
        if(length == 1 && first > 0)
            return 1;
        //假設數字爲21345,將數字分成 1~1345 和 1346~21345
        /******計算1346~ 21345中,最高位 1 出現的次數********/
        //統計 1 出現的次數
        int NumFirstDigits = 0;
        //如果最高位大於 1
        if(first > 1)
            //則 1 出現的次數爲 10的(lenght - 1)次方
            NumFirstDigits = Numbersof10(length - 1);
        //如果最高爲等於 1
        else if(first == 1)
            //則 1 的出現次數爲 除 1 以外的後面數字 + 1
            NumFirstDigits = atoi(array + 1) + 1;
        /*******計算出最高位之外 1 出現的次數********/
        //聲明一個變量,統計此種情況下 1 出現的次數
        int NumOtherDigits = first * (length - 1) * Numbersof10(length - 2);
        //遞歸計算 1~1345 中 1 出現的次數
        //聲明一個變量,計算此種情況下的 1 的個數
        int NumRecursive = Numbersof1(array + 1);
        //返回最終 1 出現的次數
        return NumFirstDigits + NumOtherDigits + NumRecursive;
    }
    
    //計算 10 的 n 次方
    int Numbersof10(unsigned int n)
    {
        int result = 1;
        for(unsigned int i = 0; i < n; ++i)
            result *= 10;
        //返回結果
        return result;
    }
};

 

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