【每日一题】2719. 统计整数数目-2024.1.16

题目;

2719. 统计整数数目

给你两个数字字符串 num1 和 num2 ,以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件,我们称它是一个好整数:

  • num1 <= x <= num2
  • min_sum <= digit_sum(x) <= max_sum.

请你返回好整数的数目。答案可能很大,请返回答案对 109 + 7 取余后的结果。

注意,digit_sum(x) 表示 x 各位数字之和。

示例 1:

输入:num1 = "1", num2 = "12", min_num = 1, max_num = 8
输出:11
解释:总共有 11 个整数的数位和在 1 到 8 之间,分别是 1,2,3,4,5,6,7,8,10,11 和 12 。所以我们返回 11 。

示例 2:

输入:num1 = "1", num2 = "5", min_num = 1, max_num = 5
输出:5
解释:数位和在 1 到 5 之间的 5 个整数分别为 1,2,3,4 和 5 。所以我们返回 5 。

提示:

  • 1 <= num1 <= num2 <= 1022
  • 1 <= min_sum <= max_sum <= 400

解答:

v1.0 模板视频讲解

v2.0 模板视频讲解 

代码:

class Solution {
    private static final int MOD=1_000_000_007;
    public int count(String num1, String num2, int min_sum, int max_sum) {
        int ans=calc(num2,min_sum,max_sum)-calc(num1,min_sum,max_sum)+MOD;//避免负数
        int sum=0;
        for(char c:num1.toCharArray()){
            sum+=c-'0';
        }
        if(min_sum<=sum&&sum<=max_sum){
            ans++;//num1是合法的,补回来
        }
        return ans%MOD;
    }
    private int calc(String s,int min_sum,int max_sum){
        int n=s.length();
        int[][] memo=new int[n][Math.min(9*n,max_sum)+1];
        for(int[] row:memo){
            Arrays.fill(row,-1);
        }
        return dfs(0,0,true,s.toCharArray(),min_sum,max_sum,memo);
    }
    private int dfs(int i,int sum,boolean isLimit,char[] s,int min_sum,int max_sum,int[][] memo){
        if(sum>max_sum){//非法
            return 0;
        }
        if(i==s.length){
            return sum>=min_sum?1:0;
        }
        if(!isLimit&&memo[i][sum]!=-1){
            return memo[i][sum];
        }
        int up=isLimit?s[i]-'0':9;
        int res=0;
        for(int d=0;d<=up;d++){//枚举当前数据填d
            res=(res+dfs(i+1,sum+d,isLimit&&(d==up),s,min_sum,max_sum,memo)) % MOD;
        }
        if(!isLimit){
            memo[i][sum]=res;
        }
        return res;
    }
}

结果:

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩軒轩儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值