赞
踩
这一题的话其实还是一个典型的求不大于 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的偏差,需要额外讨论一下。
给出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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。