每日一题-力扣-2999. 统计强大整数的数目 0410

2999. 统计强大整数的数目

问题分析

题目描述

在这里插入图片描述

题目要求统计区间 [start, finish] 内的强大整数数量。强大整数需满足以下条件:

  • 每位数字不超过 limit
  • 以字符串 s 作为后缀

关键要点理解

  1. 强大整数的定义:整数的每一位都不超过 limit,且必须以字符串 s 结尾。
  2. 区间计数:需要统计 [start, finish] 区间内满足条件的整数个数。
  3. 后缀约束:数字必须以特定的字符串 s 结尾,这是一个重要的约束条件。

示例分析

分析一下示例:

示例 1

  • 输入:start = 1, finish = 6000, limit = 4, s = “124”
  • 输出:5
  • 解释:区间 [1…6000] 内的强大整数有 124、1124、2124、3124 和 4124。
    这些数字的每个数位都 <= 4,且都以 “124” 结尾。5124 不是强大整数,因为首位数字 > 4。

示例 2

  • 输入:start = 15, finish = 215, limit = 6, s = “10”
  • 输出:2
  • 解释:区间 [15…215] 内的强大整数有 110 和 210。这些数字的每个数位都 <= 6,且都以 “10” 结尾。

示例 3

  • 输入:start = 1000, finish = 2000, limit = 4, s = “3000”
  • 输出:0
  • 解释:区间 [1000…2000] 内的数字都小于 3000,所以 “3000” 不可能是这个区间内任何数字的后缀。

解题思路

问题特性分析

这是一个典型的数位动态规划问题。需要计算满足特定条件的数字数量,其中条件涉及到数字的每一位。

这类问题的常用解法是:

  1. 计算 ≤ finish 的符合条件的数量
  2. 计算 ≤ (start-1) 的符合条件的数量
  3. 两者相减得到 [start, finish] 区间内的数量

基本思路

采用数位 DP 的方法,从高位到低位构建数字,同时考虑以下约束:

  1. 每位数字不超过 limit
  2. 不超过上界 (finish 或 start-1)
  3. 后缀必须是字符串 s

关键算法设计

设计一个递归函数 dp(pos, tight),其中:

  • pos 表示当前处理的位置(从左到右)
  • tight 表示当前是否受到上界的限制

递归过程中,需要:

  1. 验证后缀 s 是否合法(每位数字都 ≤ limit)
  2. 分别统计位数少于目标数和位数等于目标数的情况
  3. 对于位数等于目标数的情况,使用数位 DP 精确计数

代码实现

class Solution:
    def numberOfPowerfulInt(self, start: int, finish: int, limit: int, s: str) -> int:
        # 先检查后缀 s 是否合法(每位数字都不超过 limit)
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

trust Tomorrow

感谢支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值