完美整数| 豆包MarsCode AI刷题

72 阅读4分钟

题目解析:完美整数(Java 实现)

题目描述

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

测试样例

  • 样例1:

    • 输入:x = 1, y = 10
    • 输出:9
  • 样例2:

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

算法目标

  • 计算给定区间 [x, y] 内由相同数字构成的整数(完美整数)的数量。

算法步骤

  1. 遍历区间

    • 使用循环遍历区间 [x, y] 内的每个整数。
  2. 整数转字符串

    • 将当前整数转换为字符串,以便逐个字符检查。
  3. 字符一致性检查

    • 获取字符串的第一个字符作为基准。
    • 遍历字符串的其余字符,检查它们是否与基准字符相同。
    • 如果发现不同字符,则当前整数不是完美整数;否则,是完美整数。
  4. 计数

    • 如果当前整数是完美整数,则计数器加一。
  5. 返回结果

    • 循环结束后,返回计数器的值,即完美整数的数量。

算法原理

  • 整数与字符串的转换:整数转换为字符串是为了便于逐字符比较。这是因为在字符串中,可以轻松地访问和比较每个字符。
  • 字符比较:通过比较字符串中每个字符与基准字符(通常是第一个字符),可以确定整数是否由相同的数字构成。
  • 计数机制:计数器用于跟踪在给定区间内找到的完美整数的数量。

算法效率

  • 时间复杂度:由于算法需要遍历区间 [x, y] 内的每个整数,并对每个整数执行字符串转换和字符比较操作,因此时间复杂度为 O((y - x + 1) * n),其中 n 是区间内整数的平均位数。在最坏情况下(即,当 y 很大且整数位数也较多时),时间复杂度可能较高。
  • 空间复杂度:算法的空间复杂度较低,因为它主要使用固定数量的额外空间(如计数器、字符串变量等),并且不依赖于输入规模。

示例

对于输入区间 [1, 10]

  • 遍历整数 1, 2, 3, ..., 10。
  • 将每个整数转换为字符串并检查字符一致性。
  • 发现 1, 11(注意:虽然 11 不在初始区间内,但此解释是为了说明算法原理;在实际实现中,11 不会被考虑,因为算法只检查 [1, 10] 内的整数)等是由相同数字构成的(尽管 11 超出了区间,但这里仅用于解释完美整数的概念)。
  • 在此区间内,实际完美整数是那些只包含一个相同数字的整数(即 1, 2, 3, ..., 9;注意 10 不是完美整数,因为它包含两个不同的数字)。
  • 因此,计数器将增加到 9(因为 1 到 9 都是完美整数)。

请注意,上述示例中关于 11 的部分仅用于解释完美整数的概念,并不直接适用于输入区间 [1, 10] 的计算。在实际实现中,算法将仅考虑区间 [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 (isPerfectNumber(i)) {
                count++;
            }
        }
        
        // 返回完美整数的个数
        return count;
    }

    // 检查一个数是否为完美整数
    private static boolean isPerfectNumber(int num) {
        // 将整数转换为字符串
        String numStr = Integer.toString(num);
        
        // 获取字符串的第一个字符作为基准
        char firstChar = numStr.charAt(0);
        
        // 遍历字符串中的每个字符,检查是否都与基准字符相同
        for (int i = 1; i < numStr.length(); i++) {
            if (numStr.charAt(i) != firstChar) {
                return false;
            }
        }
        
        // 如果所有字符都相同,则返回 true
        return true;
    }

    public static void main(String[] args) {
        // 测试样例
        System.out.println(solution(1, 10) == 9); // 输出:true
        System.out.println(solution(2, 22) == 10); // 输出:true
    }
}

代码解释

  1. solution 方法接收两个整数 xy,表示区间的起点和终点。
  2. 初始化计数器 count 为 0。
  3. 使用 for 循环遍历区间 [x, y] 中的每个整数。
  4. 对于每个整数,调用 isPerfectNumber 方法检查其是否为完美整数。
  5. 如果 isPerfectNumber 返回 true,则计数器 count 加一。
  6. 最后返回计数器 count 的值,表示区间 [x, y] 中完美整数的个数。

isPerfectNumber 方法:

  1. 将整数转换为字符串。
  2. 获取字符串的第一个字符作为基准。
  3. 遍历字符串中的每个字符,检查是否都与基准字符相同。
  4. 如果发现不同字符,则返回 false
  5. 如果所有字符都相同,则返回 true

通过这种方法,可以有效地计算给定区间中完美整数的个数。