1. 解题思路
这一题的话其实还是一个典型的求不大于 N N N的特殊数字个数的问题。
这道题本质上进行一下替换还是要求如下问题:
对于任意一个数 n n n,求不大于 n n n的,所有位数都不超过 l i m i t limit limit,且最后几位数为 s s s的数的个数。
此时,由于最后几位数以及被限制死了为 s s s,于是我们只需要考虑 n n n的除了最后 s s s位之外的剩余部分(不妨设为 m m m),求其所有位都不超过 l i m i t limit limit的数的个数,即:
对于任意一个数 m m m,求不大于 m m m的,且所有位数都不超过 l i m i t limit limit的数的个数。
这个就是一个比较常规的题目了,我们通过一个动态规划即可给出答案。
唯一需要注意的是,需要考虑一下如果前面的位数恰好为 m m m时,拼接上后置位 s s s是否是一个满足条件的答案,这个情况可能会给结果带来一个1的偏差,需要额外讨论一下。
2. 代码实现
给出python代码实现如下:
class Solution:
@lru_cache(None)
def count(self, n, max_bit):
if len(n) == 0:
return 1
elif len(n) == 1:
return 1 + min(int(n), max_bit)
d = int(n[0])
if d > max_bit:
ans = (1+max_bit) * self.count("9" * (len(n)-1), max_bit)
else:
ans = d * self.count("9" * (len(n)-1), max_bit) + self.count(n[1:], max_bit)
return ans
def numberOfPowerfulInt(self, start: int, finish: int, limit: int, s: str) -> int:
if any(int(bit) > limit for bit in s):
return 0
def count_powerful(n):
ns = str(n)
m = len(s)
if len(ns) < m or ns < s.rjust(len(ns), "0"):
return 0
ans = -1 if ns[:-m] + s > ns and all(int(d) <= limit for d in ns[:-m]) else 0
return ans + self.count(ns[:-m], limit)
return count_powerful(finish) - count_powerful(start-1)
提交代码评测得到:耗时45ms,占用内存20.6MB。