简单题:完美整数问题| 豆包MarsCode AI刷题

32 阅读7分钟

题目要求

判断在给定区间 [x,y] 中,有多少个整数是完美整数。完美整数指的是每一位数字相同的整数,例如 1, 11, 333 等。

我的思路分析

  1. 遍历区间:在 [x,y] 区间中逐个遍历每个整数。
  2. 判断完美整数:将每个整数转换为字符串格式,然后判断字符串的每一位字符是否都相同。
  3. 计数:每当找到一个完美整数,就增加计数器。最终返回这个计数器的值。

涉及知识点

1. 数字和字符串转换

  • 知识点:在许多判断问题中,将整数转换为字符串是一种方便的方法,可以利用字符串逐位比较的特性来简化数位操作。所用到的函数为String.valueOf(int)或者是Integer.toString(int)
  • 应用:在本题中,将整数转换为字符串后,通过检查字符串的每一位字符是否相同来判断整数是否为完美整数。

2. 字符串操作与遍历

  • 知识点:字符串的字符遍历是解决字符串类型问题的基础。在Java中,可以使用charAt()方法获取字符串的特定字符,便于逐位检查。
  • 应用:本题中用charAt()获取字符串的每一位字符,检查它们是否都与首字符相同。

3. 布尔标记法

  • 知识点:布尔标记(Boolean Flag)是控制程序流程的一种常用方法,可以帮助判断是否满足特定条件。设置布尔标记时需要注意每轮循环重新初始化,避免错误判断。
  • 应用:在本题中,可以通过布尔标记判断某一数是否为完美整数。当发现某一位字符与首字符不同时,标记变为false,停止后续检查。

4. 循环和条件判断

  • 知识点for循环和if条件判断是基本的控制结构,用于遍历区间和判断条件是否满足。
  • 应用:使用for循环遍历区间内的每一个整数,使用if条件判断每个整数的每一位是否相同,从而判断是否为完美整数。

代码详解

下面是该题的代码实现:

public class Main {
    public static int solution(int x, int y) {
        // Edit your code here
        int count = 0;

    for (int i = x; i <= y; i++) {
        boolean isPerfect = true;// 每次循环要重置 isPerfect 只能放到这里,我放到外面了!!
        String s = String.valueOf(i);// 使用这个函数把整数类型的转换为字符串类型
        for (int j = 1; j < s.length(); j++) {// 拆分每一个字符串,那第一个字符与其他字符对比看是否一样
            if (s.charAt(0) != s.charAt(j)) {
                isPerfect = false;
                break;
            }
        }
        // 这段代码不能放到第二个循环里面去,要循环完才可以看是否conut++,我放到里面了
        if (isPerfect) {
            count++;
        }

        // System.out.println(count);
    }
    return count;
}

public static void main(String[] args) {
    // Add your test cases here
    // solution(211406, 664550);
    System.out.println(solution(1, 10) == 9);
    System.out.println(solution(2, 22) == 10);
}

}

时间复杂度分析:假设区间长度为 n,每个数字的平均长度为 d,则时间复杂度为 O(n×d)。

知识总结

通过在豆包MarsCode AI平台上刷题,我加深了对字符串处理循环结合应用的理解。在入门阶段,这些知识点是非常重要的基础,这种题目对编程基础的巩固和掌握有很大的帮助,尤其是在处理数位判断、条件判断和代码优化方面。以下是对几项关键知识点的总结:

1. 字符串处理

在许多判断类问题中,将整数转换为字符串是一种简便的方法。整数转为字符串后,可以利用字符串的逐位比较功能来简化数位操作,从而有效解决许多需要逐个判断数字的需求。常见的应用场景包括:

  • 判断数字是否为“完美整数”(如所有位数相同);
  • 判断数字是否为回文数(正序和逆序相同);
  • 检查重复数字的出现。

实际运用:例如判断一个数是否为完美整数,我们可以将其转为字符串,然后使用charAt()逐位比较字符,判断所有字符是否相同。这样避免了复杂的数学运算,用字符判断替代数位判断,使代码更直观易懂。

2. 布尔标记法

布尔标记法是一种常用的判断方法,在循环或条件判断中极为有效。使用布尔标记可以帮助我们控制判断流程,更好地处理嵌套条件,并避免重复或错误判断。以下是布尔标记的常见应用场景:

  • 控制判断逻辑:在循环中初始化标记为 true,如果某个条件不满足,则设置为 false,并停止后续判断。
  • 减少嵌套复杂度:布尔标记能有效减少代码的嵌套层次,让代码逻辑更加清晰,易于阅读。

实际运用:在判断数字是否为完美整数的过程中,初始化 isPerfecttrue,当发现任何一位字符与首位字符不同时,立即将其设为 false 并跳出循环。布尔标记不仅使判断条件简洁清晰,还能提升代码效率,避免不必要的多余判断。

3. 数位循环

在处理数字问题时,理解字符串字符遍历数位操作的区别是很有帮助的。在Java中,通过将整数转换为字符串,可以更直观地进行字符遍历,而不需要依赖数学运算。这种方法特别适合处理数位判断类问题,因为字符串的charAt()方法可以直接获取指定位置的字符,而无需复杂的数位提取操作。

实际运用:比如在判断回文数时,将整数转换为字符串后,可以直接比较字符串的两端字符是否相等。这种方法比传统的数位提取方式更直观,代码的可读性也更高。

对于其他和我一样刚入门同学的建议

1. 练习数位判断

从简单的题目开始,练习处理数字的每一位。常见的练习有:

  • 判断一个数字是否是回文数;
  • 检查一个数字中是否包含重复数字;
  • 确定数字的每一位是否符合某种特定条件。

通过这些练习可以更好地理解字符串与整数的转换,逐步掌握数位操作的技巧。建议:对于回文数的判断,建议先尝试字符串的比较方法,再尝试用数学的方法进行数位比较,以理解不同方法的异同和各自的优缺点。

2. 善用标记变量

布尔标记在多重判断中极为有效,能够简化逻辑,避免多层嵌套带来的复杂性。初学者可以从以下几个方面入手:

  • 练习在循环中使用布尔标记控制流程;
  • 掌握在多条件判断中通过布尔标记优化代码结构;
  • 在嵌套循环和复杂条件判断中应用布尔标记,确保代码简洁易读。

例如,在遍历字符或数组时,使用标记变量来记录是否满足特定条件,遇到不满足的情况立即退出循环,能够显著提升代码效率。

3. 尝试逐步优化

在掌握基础方法后,尝试对代码进行优化。思考代码结构是否可以精简,算法是否可以更高效。以下是一些优化建议:

  • 使用合适的数据结构:对于需要判断重复元素的场景,尝试使用Set结构,能够更快地进行重复判断,并简化代码逻辑。
  • 避免不必要的重复操作:将一些固定值计算或判断提取到循环外,减少不必要的操作,提高效率。
  • 代码结构优化:避免深层嵌套,简化代码逻辑,提高可读性。

例如,在完美整数的判断中,若已发现不符合条件的字符,可以立刻跳出循环,避免多余判断;在查找重复元素的题目中,可以利用Set来提升效率。

小菜鸟在不断进步~~~一起加油!(感觉还有其他思路2024.11.03)