剑指 Offer 43. 1~n 整数中 1 出现的次数

输入一个整数 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) ;
    }
};
posted @ 2022-01-07 11:33  spnooyseed  阅读(41)  评论(0编辑  收藏  举报