劍指 Offer 43. 1~n 整數中 1 出現的次數
阿新 • • 發佈:2022-01-07
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) ; } };