103.完美整数| 豆包MarsCode AI刷题

55 阅读6分钟

问题描述

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

思路分析

明确目标:要判断给定区间[x, y]内的每个整数是否为完美整数,然后统计完美整数的个数。完美整数的定义是该整数由相同的数字构成,所以需要一种方法来检查每个整数的各位数字是否相同。

转换思路:为了方便检查各位数字是否相同,将整数先转换为字符串形式。通过遍历字符串的每个字符,并与第一个字符进行比较,如果存在不同的字符,那么该整数就不是完美整数;若遍历完整个字符串所有字符都和第一个字符相同,则该整数是完美整数,进而对完美整数进行计数统计。

解题步骤

1.初始化计数变量:定义一个整型变量count并初始化为0,用于记录区间[x, y]内完美整数的个数。

2.遍历区间内的整数:使用for循环,让循环变量i从区间下限x开始,每次递增1,直到i达到区间上限y(即i<=y),依次对区间内的每个整数进行处理。

3.整数转字符串并获取首字符:对于当前的整数i,先通过Integer.toString(i)方法将其转换为字符串形式numberStr,然后获取这个字符串表示的第一个字符firstChar(使用numberStr.charAt(0)方法),后续将用这个首字符与其他字符进行比较来判断是否为完美整数。

4.检查各位数字是否相同:通过一个增强for循环遍历字符串numberStr的每一个字符(将字符串转换为字符数组形式numberStr.toCharArray()),在循环中,对于当前字符 c,将它与首字符firstChar进行比较,如果发现有字符c与firstChar不一样,说明该整数不是完美整数,此时将布尔变量isPerfect设置为false,并使用break语句跳出内层循环,无需再继续比较后面的字符了;若内层循环完整遍历完字符串所有字符,都没有发现不一致的情况,那么isPerfect保持为true,表示当前整数是完美整数。

5.计数操作:当判断当前整数i是完美整数(即isPerfect为true)时,将计数变量count的值加1。

6.返回结果:在遍历完区间[x, y]内的所有整数后,返回计数变量count的值,这个值就是区间内完美整数的个数。

代码解释和注释

public class Main {
    // solution方法用于计算给定区间[x, y]内完美整数(由相同数字构成的整数)的个数
    public static int solution(int x, int y) {
        int count = 0;  // 初始化计数变量count,用于记录完美整数的个数,初始值为0

        // 通过for循环遍历给定区间[x, y]内的每一个整数,i代表当前整数
        for (int i = x; i <= y; i++) {
            // 将当前整数i转换为字符串形式,方便后续检查各位数字
            String numberStr = Integer.toString(i);
            // 获取转换后的字符串的第一个字符,后续用于和其他字符对比
            char firstChar = numberStr.charAt(0);
            boolean isPerfect = true;  // 先假设当前整数是完美整数,用isPerfect标记

            // 通过增强for循环遍历字符串numberStr的每一个字符,c代表当前遍历到的字符
            for (char c : numberStr.toCharArray()) {
                // 如果当前字符c与第一个字符firstChar不同,说明不是完美整数
                if (c!= firstChar) {
                    isPerfect = false;  // 将标记设置为false
                    break;  // 一旦发现不一致,直接跳出内层循环,无需继续比较
                }
            }

            // 如果经过上述检查后,isPerfect仍为true,说明当前整数是完美整数
            if (isPerfect) {
                count++;  // 将完美整数的计数变量count加1
            }
        }

        return count;  // 返回区间[x, y]内完美整数的个数
    }

    public static void main(String[] args) {
        // 调用solution方法传入相应区间进行测试,判断返回结果是否等于预期结果,并输出比较结果(true或false)
        System.out.println(solution(1, 10) == 9);
        // 再次调用solution方法传入另一个区间进行测试,判断返回结果是否等于预期结果,并输出比较结果(true或false)
        System.out.println(solution(2, 22) == 10);
    }
}

总结

功能实现:代码按照完美整数的定义,成功实现了统计给定区间内完美整数个数的功能。通过将整数转换为字符串并遍历比较字符的方式,清晰地判断每个整数是否符合条件,并准确进行计数。

优点: 逻辑清晰易懂:整体代码结构较为简单,采用了两层循环嵌套的方式,外层循环控制区间内整数的遍历,内层循环用于检查每个整数各位数字是否相同,这种分层的逻辑便于理解代码的功能实现过程。利用合适的数据类型转换:巧妙地将整数转换为字符串来处理,利用字符串易于遍历和比较字符的特点,简化了判断各位数字是否相同的操作,符合常规的编程思路,容易让人读懂代码意图。

可改进之处: 输入验证方面:代码没有对输入的区间边界x和y的合法性进行检查,例如没有判断x是否小于等于y,若传入不符合要求的区间参数(如x>y),程序虽然不会报错,但可能得到不符合预期的结果,可添加相应的输入验证逻辑来增强程序的健壮性。性能优化角度:对于较大的区间范围,将每个整数都转换为字符串并逐个字符比较的方式可能会存在一定的性能开销。可以考虑一些数学规律或者更高效的算法来优化判断过程,比如对于两位数以上的整数,如果它能被11整除且各位数字之和能被它的位数整除(仅适用于部分情况,可作为一种优化思路进一步拓展完善),有可能是完美整数,通过这类数学特性提前筛选部分整数,减少不必要的字符串转换和字符比较操作,提升整体性能。

总体而言,这段代码完成了既定的功能任务,有着清晰的逻辑结构,但在输入验证以及应对大数据量时的性能优化方面还存在改进的空间,可根据具体的应用场景进一步优化完善。