题目要求
判断在给定区间 [x,y] 中,有多少个整数是完美整数。完美整数指的是每一位数字相同的整数,例如 1
, 11
, 333
等。
我的思路分析
- 遍历区间:在 [x,y] 区间中逐个遍历每个整数。
- 判断完美整数:将每个整数转换为字符串格式,然后判断字符串的每一位字符是否都相同。
- 计数:每当找到一个完美整数,就增加计数器。最终返回这个计数器的值。
涉及知识点
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
,并停止后续判断。 - 减少嵌套复杂度:布尔标记能有效减少代码的嵌套层次,让代码逻辑更加清晰,易于阅读。
实际运用:在判断数字是否为完美整数的过程中,初始化 isPerfect
为 true
,当发现任何一位字符与首位字符不同时,立即将其设为 false
并跳出循环。布尔标记不仅使判断条件简洁清晰,还能提升代码效率,避免不必要的多余判断。
3. 数位循环
在处理数字问题时,理解字符串字符遍历和数位操作的区别是很有帮助的。在Java中,通过将整数转换为字符串,可以更直观地进行字符遍历,而不需要依赖数学运算。这种方法特别适合处理数位判断类问题,因为字符串的charAt()
方法可以直接获取指定位置的字符,而无需复杂的数位提取操作。
实际运用:比如在判断回文数时,将整数转换为字符串后,可以直接比较字符串的两端字符是否相等。这种方法比传统的数位提取方式更直观,代码的可读性也更高。
对于其他和我一样刚入门同学的建议
1. 练习数位判断
从简单的题目开始,练习处理数字的每一位。常见的练习有:
- 判断一个数字是否是回文数;
- 检查一个数字中是否包含重复数字;
- 确定数字的每一位是否符合某种特定条件。
通过这些练习可以更好地理解字符串与整数的转换,逐步掌握数位操作的技巧。建议:对于回文数的判断,建议先尝试字符串的比较方法,再尝试用数学的方法进行数位比较,以理解不同方法的异同和各自的优缺点。
2. 善用标记变量
布尔标记在多重判断中极为有效,能够简化逻辑,避免多层嵌套带来的复杂性。初学者可以从以下几个方面入手:
- 练习在循环中使用布尔标记控制流程;
- 掌握在多条件判断中通过布尔标记优化代码结构;
- 在嵌套循环和复杂条件判断中应用布尔标记,确保代码简洁易读。
例如,在遍历字符或数组时,使用标记变量来记录是否满足特定条件,遇到不满足的情况立即退出循环,能够显著提升代码效率。
3. 尝试逐步优化
在掌握基础方法后,尝试对代码进行优化。思考代码结构是否可以精简,算法是否可以更高效。以下是一些优化建议:
- 使用合适的数据结构:对于需要判断重复元素的场景,尝试使用
Set
结构,能够更快地进行重复判断,并简化代码逻辑。 - 避免不必要的重复操作:将一些固定值计算或判断提取到循环外,减少不必要的操作,提高效率。
- 代码结构优化:避免深层嵌套,简化代码逻辑,提高可读性。
例如,在完美整数的判断中,若已发现不符合条件的字符,可以立刻跳出循环,避免多余判断;在查找重复元素的题目中,可以利用Set
来提升效率。