青训营X豆包MarsCode 技术训练营第一课 | 豆包MarsCode AI 刷题

76 阅读2分钟

题目:量化数字统计

问题描述

小M最近对一种特别的数字产生了兴趣。他称某个数字为“量化数字”,当且仅当这个数字满足以下两个条件:

  1. 该数字能被3整除。
  2. 该数字的所有位数都是相同的数字。

例如,数字666是一个量化数字,因为它能被3整除,并且所有位数都是6

现在给定两个整数LR,你需要统计在LR范围内(包括LR)的所有量化数字,并返回这个数字的个数。

解题思路

  1. 理解量化数字的定义

    • 量化数字必须能被3整除。
    • 量化数字的所有位数必须相同。
  2. 数据结构的选择

    • 使用集合(set)来存储预先计算好的量化数字,以便快速查找。

算法步骤

  • 预计算量化数字:生成所有可能的量化数字,并将它们存储在集合中。
  • 检查范围:在给定的LR范围内,直接检查这些预先计算好的量化数字是否在范围内,并统计数量

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

优化方法

  1. 减少不必要的循环和检查

    • 通过预先计算所有可能的量化数字,避免了在每次循环中进行字符串转换和集合操作,从而减少了时间复杂度。
  2. 时间复杂度分析

    • 预计算:生成所有可能的量化数字的时间复杂度是O(log(N)),其中N是最大的量化数字。
    • 检查范围:检查范围内的量化数字的时间复杂度是O(1),因为我们直接使用了集合的查找操作。

总结

通过预先计算和使用集合来存储量化数字,我们能够有效地减少不必要的循环和检查,从而提高代码的效率。这种方法不仅适用于当前的问题,还可以推广到其他需要预计算和快速查找的场景中。


希望这篇笔记对你理解这道题有所帮助! 在青训营中共同交流学习和进步!