AI 刷题 完美整数 题解 | 豆包MarsCode AI刷题

30 阅读3分钟

完美整数

问题描述

一个整数如果由相同的数字构成,则称为完美整数。例如:

  • 111333 是完美整数。
  • 1219101 是不完美整数。

现在,需要计算给定区间 [x, y] 中有多少个整数是完美整数。

测试样例

样例1:

输入:x = 1 ,y = 10
输出:9

样例2:

输入:x = 2 ,y = 22
输出:10

解题思路

  1. 定义完美整数:一个整数如果由相同的数字构成,则称为完美整数。例如,111223333 都是完美整数。

  2. 判断一个数是否为完美整数

    • 将整数转换为字符串。
    • 检查字符串中的所有字符是否相同。
  3. 遍历区间 [x, y]

    • 从 x 到 y 遍历每个整数。
    • 对每个整数判断其是否为完美整数。
    • 统计完美整数的数量。

解题代码

public class Main {
    public static int solution(int x, int y) {
        int count = 0;
        // 遍历区间 [x, y] 中的每一个整数
        for (int i = x; i <= y; i++) {
            // 检查当前整数是否是完美整数
            if (isPerfectInteger(i)) {
                count++;
            }
        }
        return count;
    }

    // 辅助方法:判断一个整数是否是完美整数
    private static boolean isPerfectInteger(int num) {
        // 将整数转换为字符串
        String numStr = String.valueOf(num);
        // 获取字符串的第一个字符
        char firstChar = numStr.charAt(0);
        // 检查字符串中的所有字符是否相同
        for (char c : numStr.toCharArray()) {
            if (c != firstChar) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        // 添加你的测试用例
        System.out.println(solution(1, 10) == 9);
        System.out.println(solution(2, 22) == 10);
    }
}

关键步骤:

  1. 遍历区间:使用 for 循环遍历从 x 到 y 的所有整数。
  2. 检查完美整数:编写一个辅助方法 isPerfectInteger 来判断一个整数是否是完美整数。
  3. 计数:在 solution 方法中,使用一个计数器来统计完美整数的数量。

时间复杂度

solution 方法的时间复杂度

在 solution 方法中,使用了一个 for 循环来遍历区间 [x, y] 中的每一个整数。假设区间的大小为 n = y - x + 1,那么这个循环的时间复杂度是 O(n)

isPerfectInteger 方法的时间复杂度

在 isPerfectInteger 方法中,你将整数转换为字符串,并检查字符串中的所有字符是否相同。假设整数的位数为 m,那么这个方法的时间复杂度是 O(m)

总体时间复杂度

由于 solution 方法会调用 isPerfectInteger 方法 n 次,因此总体的时间复杂度是:

[ O(n \times m) ]

其中:

  • n 是区间 [x, y] 的大小。
  • m 是区间内最大整数的位数。

优化建议

虽然当前的时间复杂度已经是线性的(假设 m 是一个常数),但在某些情况下,可以进一步优化:

  1. 减少字符串转换

    • 字符串转换和字符比较可能会带来一些额外的开销。你可以考虑直接使用整数运算来判断一个整数是否是完美整数。
  2. 提前终止

    • 在 isPerfectInteger 方法中,如果发现某个字符与第一个字符不同,可以立即返回 false,这样可以减少不必要的比较。