数位模板
刷题时下意识的套用数位模板,虽然也能解决该题,但是总是感觉有点小题大做的感受。
from functools import lru_cache
def solution(x, y):
# Edit your code here
def calc(high: str)->int:
@lru_cache
def dfs(is_num: bool,i: int,num: int,is_limit: bool)->int:
if i==len(high):
return 1 if is_num else 0
res = 0
if not is_num:
res = dfs(False,i+1,num,False)
if num>int(high[i]) and is_limit:
return res
res += dfs(True,i+1,num,is_limit and num==int(high[i]))
return res
return sum(dfs(False,0,i,True) for i in range(1,10))
ans = calc(str(y))-calc(str(x-1))
return ans
if __name__ == "__main__":
# Add your test cases here
print(solution(1, 10) == 9)
print(solution(2, 22) == 10)
为尝试更加简便的解决方案,经豆包MarsCode AI提供解题思路,成功实现了更为简便的方法。
解题思路
-
定义完美整数:完美整数是由相同数字组成的整数,例如 1, 11, 333 等。
-
思路分析:
- 在区间
[x, y]内,我们需要统计有多少个完美整数。 - 完美整数的特点是数字重复构成,因此一个
k位的完美整数可以表示为由某个数字d(1 到 9 之间)重复k次构成。
- 在区间
-
枚举完美整数:
- 直接枚举所有可能的完美整数。因为完美整数的位数有限,可以依次构造从 1 位到适合范围的完美整数。
- 对于每个位数
k,我们构造1到9之间的所有数字重复k次得到完美整数,检查它是否在[x, y]范围内。
-
具体步骤:
- 遍历
1到9,将每个数字构造成不同位数的完美整数。 - 使用循环控制位数增长(例如
1,11,111等)。 - 检查每个构造的完美整数是否在
[x, y]范围内,如果是,计数加一。
- 遍历
-
复杂度分析:
- 由于完美整数的数目和位数有限,且每次构造的数字是指数级增长,这种方法在合理范围内可以有效统计出符合条件的完美整数。
def count_perfect_numbers(x, y):
count = 0
# 枚举从 1 到 9 的数字作为完美整数的基础数字
for digit in range(1, 10):
num = digit
# 生成完美整数 num,并在符合范围时计数
while num <= y:
if num >= x:
count += 1
# 扩展位数,例如:1 -> 11 -> 111 等
num = num * 10 + digit
return count
# 测试
print(count_perfect_numbers(1, 10)) # 输出: 9
print(count_perfect_numbers(2, 22)) # 输出: 10
豆包MarsCode提供的 云端编辑器非常实用
- 云端编辑器能实时提供代码运行、调试环境,支持多种编程语言,无需用户在本地配置复杂的开发环境。这使得刷题更加便捷、高效,尤其适合希望随时随地学习的用户。
- 不仅节省了环境配置的时间,还通过自动保存功能,确保用户不会因断网、切换设备而丢失进度。智能提示和自动补全功能让用户能专注于算法思维的培养而不是代码语法的细节。
刷题实践:AI 刷题的优势
在我使用 AI 刷题平台进行学习的过程中,这些功能帮助我极大地提升了效率:
在练习动态规划算法时,平台根据我的完成情况,推荐了与我掌握程度相符的真题和经典习题。起初,我在入门级别的题目上测试算法的基本逻辑,而当系统检测到我具备了基础理解后,逐渐推荐了一些进阶问题,使我可以循序渐进地提升技能。这种推荐机制帮助我避免了在同一难度层级反复练习的低效学习,也避免了因跳跃到过高难度题目而挫败。
同时,通过云端编辑器,我可以直接调试和优化代码。这种实时反馈让我得以在练习中迅速发现和纠正错误,尤其是在调试复杂算法时,云端编辑器的性能优势和多种编程语言支持显得尤为关键。