豆包MarsCode AI 刷题记录6

18 阅读4分钟

一个整数如果由相同的数字构成,则称为完美整数。例如: 1、11、333 是完美整数。 12、19、101 是不完美整数。 现在,你需要计算给定区间 [x, y] 中有多少个整数是完美整数。 测试样例 样例1: 输入:x = 1 ,y = 10

学习笔记:完美整数的判断与区间筛选

一、问题分析

题目要求我们计算一个给定区间 [x, y] 中有多少个完美整数。一个整数被称为完美整数,如果它由相同的数字组成。例如:

  • 完美整数:1、11、333。
  • 不完美整数:12、19、101。

完美整数的特征是它由同一个数字重复组成,比如 111222 等。而不完美整数则是由不同的数字组合而成,比如 1219101 等。

我们的目标是通过判断区间 [x, y] 中的每个整数是否是完美整数,统计出符合条件的整数个数。

二、如何判断一个整数是否为完美整数?

判断一个整数是否是完美整数,可以通过以下步骤:

  1. 将数字转换为字符串:将整数转换为字符串,方便检查每一位数字。
  2. 判断字符是否相同:将字符串中的所有字符放入一个集合中,集合中的元素个数为1时,说明该整数是完美整数。因为集合中的重复元素会被去除,所以如果集合的大小为1,表示所有字符都相同。

例如:

  • 111 -> 转换为字符串 '111',集合为 {'1'},大小为1,说明是完美整数。
  • 121 -> 转换为字符串 '121',集合为 {'1', '2'},大小大于1,说明不是完美整数。

三、解决方案

为了解决这个问题,我们可以遍历区间 [x, y] 中的每个整数,检查它是否是完美整数。如果是,则计数加一。最终输出计数结果。

  1. 遍历区间:从 xy 逐一检查每个整数。
  2. 判断完美整数:对于每个整数,转换为字符串并检查是否所有字符相同。
  3. 输出结果:统计满足条件的整数数量并返回。

四、代码实现

def solution(x, y):
    count = 0
    for num in range(x, y + 1):
        # 将数字转换为字符串,判断是否所有字符相同
        if len(set(str(num))) == 1:
            count += 1
    return count

# 测试样例
if __name__ == "__main__":
    print(solution(1, 10) == 9)  # 完美整数:1, 2, ..., 9(共9个)
    print(solution(2, 22) == 10)  # 完美整数:2, 3, ..., 9, 11, 22(共10个)

五、代码解释

  1. 初始化计数器count = 0。我们使用 count 来统计完美整数的数量。

  2. 遍历区间:使用 for num in range(x, y + 1) 遍历区间 [x, y] 中的每个整数。

  3. 判断完美整数:通过 set(str(num)) 将当前数字转换为字符串并放入集合。若集合的长度为1,则说明数字的每一位都是相同的,即为完美整数。

    • set(str(num)):将数字转换为字符串,然后转换为集合,集合中的元素是去重后的数字字符。如果集合的大小为1,说明所有数字字符相同。
  4. 更新计数器:如果当前数字是完美整数,则将计数器 count 加1。

  5. 返回结果:最终返回 count,即区间内完美整数的个数。

六、复杂度分析

  1. 时间复杂度

    • 遍历区间 [x, y] 中的每个整数,区间的大小为 y - x + 1
    • 对于每个整数,我们将其转换为字符串并判断其字符是否相同。这个操作的时间复杂度是 O(d),其中 d 是数字的位数。对于大多数整数来说,d 的最大值是一个常数,因此可以认为时间复杂度是 O(1)
    • 因此,总的时间复杂度是 O(n),其中 n 是区间 [x, y] 的大小,即 y - x + 1
  2. 空间复杂度

    • 我们只使用了 set 来存储每个数字的字符,空间复杂度是 O(d),其中 d 是数字的位数。对于大多数情况来说,d 是一个常数,因此空间复杂度可以视为 O(1)

七、优化思考

目前的解法已经相对简单直接,且能够满足常见的区间范围。我们可以通过以下几种方式进一步优化:

  1. 直接生成完美整数

    • 完美整数的形式通常是由一个数字重复组成的。我们可以事先生成所有可能的完美整数,比如 1, 2, 3, ..., 9, 11, 22, 33, ..., 99 等,并直接在区间 [x, y] 中查找这些完美整数是否存在。这种方式适用于给定范围较小或需要频繁查询的情况。
  2. 避免重复判断

    • 如果区间非常大,我们可以采用一些数学性质或更高效的数据结构(如位图)来避免重复计算,从而提升效率。