數字 1 的個數

233. 數字 1 的個數

來源: LeetCode 233. 數字 1 的個數

題目描述

233. 數字 1 的個數
給定一個整數 n,計算所有小於等於 n 的非負整數中數字 1 出現的個數。

示例:

輸入: 13
輸出: 6 
解釋: 數字 1 出現在以下數字中: 1, 10, 11, 12, 13 。

思路分析

代碼

class Solution {
public:
    int countDigitOne(int n) {
        // 數位DP
        // [0,10)1
        // [10,20)10
        // [0,100)20
        // [100,1000) 300
        if(n == 0) return 0;
        typedef pair<long long, long long> info;
        vector<info> digit;
        int x = n; long long y=1;
        while(x){
            int z = x%10;
            digit.push_back(make_pair(z, z*y));
            if(digit.size() > 1) digit.back().second += digit[digit.size() - 2].second; 
            x/=10;
            y *= 10;
        }
        vector<info> dp(digit.size(), make_pair(1,1));
        int res = digit[0].first > 0 ? 1 : 0;
        for(int i=1; i<digit.size(); ++i){
            dp[i].first = dp[i-1].first * 10;  
            dp[i].second = dp[i-1].second * 10;
            dp[i].first += dp[i].second;
            res += digit[i].first > 0 ?  dp[i-1].first*digit[i].first : 0;
            res += digit[i].first > 1 ? dp[i].second : digit[i].first == 1 ? digit[i-1].second+1:0;
        }
        return res;
    }
};

算法分析

代碼改進

相似擴展

  • 相似題目
  • 升級版本

歸納總結

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