题目解析:完美整数(Java 实现)
题目描述
一个整数如果由相同的数字构成,则称为完美整数。例如,1、11、333 是完美整数,而 12、19、101 则不是。现在需要计算给定区间 [x, y] 中有多少个整数是完美整数。
测试样例
-
样例1:
- 输入:
x = 1,y = 10 - 输出:
9
- 输入:
-
样例2:
- 输入:
x = 2,y = 22 - 输出:
10
- 输入:
算法目标
- 计算给定区间
[x, y]内由相同数字构成的整数(完美整数)的数量。
算法步骤
-
遍历区间:
- 使用循环遍历区间
[x, y]内的每个整数。
- 使用循环遍历区间
-
整数转字符串:
- 将当前整数转换为字符串,以便逐个字符检查。
-
字符一致性检查:
- 获取字符串的第一个字符作为基准。
- 遍历字符串的其余字符,检查它们是否与基准字符相同。
- 如果发现不同字符,则当前整数不是完美整数;否则,是完美整数。
-
计数:
- 如果当前整数是完美整数,则计数器加一。
-
返回结果:
- 循环结束后,返回计数器的值,即完美整数的数量。
算法原理
- 整数与字符串的转换:整数转换为字符串是为了便于逐字符比较。这是因为在字符串中,可以轻松地访问和比较每个字符。
- 字符比较:通过比较字符串中每个字符与基准字符(通常是第一个字符),可以确定整数是否由相同的数字构成。
- 计数机制:计数器用于跟踪在给定区间内找到的完美整数的数量。
算法效率
- 时间复杂度:由于算法需要遍历区间
[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
}
}
代码解释
solution方法接收两个整数x和y,表示区间的起点和终点。- 初始化计数器
count为 0。 - 使用
for循环遍历区间[x, y]中的每个整数。 - 对于每个整数,调用
isPerfectNumber方法检查其是否为完美整数。 - 如果
isPerfectNumber返回true,则计数器count加一。 - 最后返回计数器
count的值,表示区间[x, y]中完美整数的个数。
isPerfectNumber 方法:
- 将整数转换为字符串。
- 获取字符串的第一个字符作为基准。
- 遍历字符串中的每个字符,检查是否都与基准字符相同。
- 如果发现不同字符,则返回
false。 - 如果所有字符都相同,则返回
true。
通过这种方法,可以有效地计算给定区间中完美整数的个数。