1. 程式人生 > 其它 >劍指 Offer 43. 1~n 整數中 1 出現的次數

劍指 Offer 43. 1~n 整數中 1 出現的次數

https://files.cnblogs.com/files/spnooyseed/2025644.gif

輸入一個整數 n ,求1~n這n個整數的十進位制表示中1出現的次數。

例如,輸入12,1~12這些整數中包含1 的數字有1、10、11和12,1一共出現了5次。

示例 1:

輸入:n = 12
輸出:5
示例 2:

輸入:n = 13
輸出:6

限制:1 <= n < 2^31

直接上數位dp

class Solution {
public:
    int a[40] , cnt = 0 , dp[40][40] ;
    int dfs(int u , int num , int limit) {

        if(u == cnt + 1) return num ;

        if(!limit && dp[u][num] != -1) return dp[u][num] ;
        int end = limit ? a[u] : 9 , ans = 0 ;
        for(int i = 0 ;i <= end ;i ++ ) 
            ans += dfs(u + 1 , num + (i == 1) , limit && i == end) ;

        if(!limit) dp[u][num] = ans ;
        return ans ;
    }
    int solve(int n) {
        while(n) a[++ cnt] = n % 10 , n /= 10 ;
        reverse(a + 1 , a + cnt + 1) ;
        memset(dp , -1 , sizeof dp) ;
        return dfs(1 , 0 , 1) ;
    }
    int countDigitOne(int n) {
        return solve(n) ;
    }
};
每次做題提醒自己:題目到底有沒有讀懂,有沒有分析徹底、演算法夠不夠貪心、暴力夠不夠優雅。