完美整数| 豆包MarsCode AI 刷题

65 阅读3分钟

伴学笔记:完美整数计数算法分析与实现

在编程练习中,我们经常会遇到需要处理整数的问题。本文将详细分析一个特定的编程问题:计算给定区间 [x, y] 中有多少个整数是完美整数。完美整数的定义是所有数字都相同的整数,例如 111333 等。我们将通过逐步推理和代码实现来解决这个问题。

问题理解

首先,我们需要明确问题的要求:

  • 输入:两个整数 x 和 y,表示一个闭区间 [x, y]
  • 输出:该区间内完美整数的数量。

完美整数的特征是所有数字都相同。例如,111 是一个完美整数,而 123 不是。

数据结构与算法选择

为了解决这个问题,我们可以采用以下步骤:

  1. 遍历区间:从 x 到 y 遍历每个整数。
  2. 字符串转换:将每个整数转换为字符串,以便于检查其数字是否相同。
  3. 检查数字一致性:通过比较字符串中的每个字符是否与第一个字符相同,来判断该整数是否为完美整数。
  4. 计数:统计满足条件的整数数量。

代码分析

  1. 遍历区间

    • 使用 for 循环从 x 遍历到 y,每次迭代处理一个整数 num
  2. 字符串转换

    • 使用 String.valueOf(num) 将整数 num 转换为字符串 numStr
  3. 检查数字一致性

    • 初始化布尔变量 isPerfect 为 true
    • 使用 for 循环从字符串的第二个字符开始,逐个比较每个字符是否与第一个字符相同。
    • 如果发现不同的字符,将 isPerfect 设为 false 并跳出循环。
  4. 计数

    • 如果 isPerfect 为 true,则表示当前整数是完美整数,计数器 count 加一。
  5. 返回结果

    • 循环结束后,返回计数器 count 的值。

测试用例

在 main 方法中,我们添加了两个测试用例:

  • solution(1, 10) 应该返回 9,因为区间 [1, 10] 中有 1, 2, 3, 4, 5, 6, 7, 8, 9 这 9 个完美整数。
  • solution(2, 22) 应该返回 10,因为区间 [2, 22] 中有 2, 3, 4, 5, 6, 7, 8, 9, 11, 22 这 10 个完美整数。

时间复杂度分析

  • 外层循环:遍历区间 [x, y],时间复杂度为 O(y - x)
  • 内层循环:对于每个整数,检查其所有数字是否相同,时间复杂度为 O(d),其中 d 是整数的位数。

总体时间复杂度为 O((y - x) * d),在实际应用中,d 通常是一个较小的常数(最多为 10),因此可以认为时间复杂度接近线性。

空间复杂度分析

  • 字符串转换:每次将整数转换为字符串,空间复杂度为 O(d)
  • 其他变量:使用常数空间存储计数器和布尔变量。

总体空间复杂度为 O(d),在实际应用中,d 是一个较小的常数,因此空间复杂度较低。

优化思路

虽然当前算法已经足够高效,但在某些极端情况下(例如 x 和 y 非常大),可以考虑以下优化:

  • 跳过非完美整数:在遍历过程中,如果发现某个整数不是完美整数,可以直接跳过其后续的相同数字的整数。
  • 数学方法:通过数学方法直接计算完美整数的数量,而不是逐个检查。

总结

本文详细分析了如何计算给定区间内的完美整数数量。通过逐步推理和代码实现,我们展示了如何使用字符串转换和循环检查来解决这个问题。代码实现简单直观,时间复杂度和空间复杂度均较低,适用于大多数实际应用场景。通过进一步的优化,可以进一步提升算法的效率。