[Python手撕]最大为 N 的数字组合有多少
- 最大为 N 的数字组合
给定一个按 非递减顺序 排列的数字数组 digits 。你可以用任意次数 digits[i] 来写的数字。例如,如果 digits = ['1','3','5'],我们可以写数字,如 '13', '551', 和 '1351315'。
返回 可以生成的小于或等于给定整数 n 的正整数的个数 。
示例 1:
输入:digits = ["1","3","5","7"], n = 100
输出:20
解释:
可写出的 20 个数字是:
1, 3, 5, 7, 11, 13, 15, 17, 31, 33, 35, 37, 51, 53, 55, 57, 71, 73, 75, 77.
class Solution:
def atMostNGivenDigitSet(self, digits: List[str], n: int) -> int:
str_n = str(n)
len_n = len(str_n)
len_digits = len(digits)
# Step 1: 计算位数小于 n 的所有可能数
count = 0
for i in range(1, len_n):
count += len_digits ** i
# Step 2: 计算与 n 位数相同的可能数
for i in range(len_n):
has_same_prefix = False
for d in digits:
if d < str_n[i]:
count += len_digits ** (len_n - i - 1)
elif d == str_n[i]:
has_same_prefix = True
break
if not has_same_prefix:
return count
# 如果所有的前缀都相同,则加上 n 本身
return count + 1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义