题目:量化数字统计
问题描述
小M最近对一种特别的数字产生了兴趣。他称某个数字为“量化数字”,当且仅当这个数字满足以下两个条件:
- 该数字能被
3整除。 - 该数字的所有位数都是相同的数字。
例如,数字666是一个量化数字,因为它能被3整除,并且所有位数都是6。
现在给定两个整数L和R,你需要统计在L到R范围内(包括L和R)的所有量化数字,并返回这个数字的个数。
解题思路
-
理解量化数字的定义:
- 量化数字必须能被
3整除。 - 量化数字的所有位数必须相同。
- 量化数字必须能被
-
数据结构的选择:
- 使用集合(
set)来存储预先计算好的量化数字,以便快速查找。
- 使用集合(
算法步骤:
- 预计算量化数字:生成所有可能的量化数字,并将它们存储在集合中。
- 检查范围:在给定的
L到R范围内,直接检查这些预先计算好的量化数字是否在范围内,并统计数量
def solution(L: int, R: int) -> int: # 预先计算所有可能的量化数字 quantifiable_numbers = set() for digit in range(1, 10): # 从1到9的数字 num = digit while num <= 10**8: # 10^9是任意大的数,确保覆盖所有可能的范围 if num % 3 == 0: quantifiable_numbers.add(num) num = num * 10 + digit # 生成下一个相同位数的数字
# 统计在L到R范围内的量化数字
count = 0
for num in quantifiable_numbers:
if L <= num <= R:
count += 1
return count
优化方法
-
减少不必要的循环和检查:
- 通过预先计算所有可能的量化数字,避免了在每次循环中进行字符串转换和集合操作,从而减少了时间复杂度。
-
时间复杂度分析:
- 预计算:生成所有可能的量化数字的时间复杂度是
O(log(N)),其中N是最大的量化数字。 - 检查范围:检查范围内的量化数字的时间复杂度是
O(1),因为我们直接使用了集合的查找操作。
- 预计算:生成所有可能的量化数字的时间复杂度是
总结
通过预先计算和使用集合来存储量化数字,我们能够有效地减少不必要的循环和检查,从而提高代码的效率。这种方法不仅适用于当前的问题,还可以推广到其他需要预计算和快速查找的场景中。
希望这篇笔记对你理解这道题有所帮助! 在青训营中共同交流学习和进步!