完美整数
问题描述
一个整数如果由相同的数字构成,则称为完美整数。例如:
1、11、333是完美整数。12、19、101是不完美整数。
现在,需要计算给定区间 [x, y] 中有多少个整数是完美整数。
测试样例
样例1:
输入:
x = 1 ,y = 10
输出:9
样例2:
输入:
x = 2 ,y = 22
输出:10
解题思路
-
定义完美整数:一个整数如果由相同的数字构成,则称为完美整数。例如,
111、22、3333都是完美整数。 -
判断一个数是否为完美整数:
- 将整数转换为字符串。
- 检查字符串中的所有字符是否相同。
-
遍历区间
[x, y]:- 从
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 (isPerfectInteger(i)) {
count++;
}
}
return count;
}
// 辅助方法:判断一个整数是否是完美整数
private static boolean isPerfectInteger(int num) {
// 将整数转换为字符串
String numStr = String.valueOf(num);
// 获取字符串的第一个字符
char firstChar = numStr.charAt(0);
// 检查字符串中的所有字符是否相同
for (char c : numStr.toCharArray()) {
if (c != firstChar) {
return false;
}
}
return true;
}
public static void main(String[] args) {
// 添加你的测试用例
System.out.println(solution(1, 10) == 9);
System.out.println(solution(2, 22) == 10);
}
}
关键步骤:
- 遍历区间:使用
for循环遍历从x到y的所有整数。 - 检查完美整数:编写一个辅助方法
isPerfectInteger来判断一个整数是否是完美整数。 - 计数:在
solution方法中,使用一个计数器来统计完美整数的数量。
时间复杂度
solution 方法的时间复杂度
在 solution 方法中,使用了一个 for 循环来遍历区间 [x, y] 中的每一个整数。假设区间的大小为 n = y - x + 1,那么这个循环的时间复杂度是 O(n)。
isPerfectInteger 方法的时间复杂度
在 isPerfectInteger 方法中,你将整数转换为字符串,并检查字符串中的所有字符是否相同。假设整数的位数为 m,那么这个方法的时间复杂度是 O(m)。
总体时间复杂度
由于 solution 方法会调用 isPerfectInteger 方法 n 次,因此总体的时间复杂度是:
[ O(n \times m) ]
其中:
n是区间[x, y]的大小。m是区间内最大整数的位数。
优化建议
虽然当前的时间复杂度已经是线性的(假设 m 是一个常数),但在某些情况下,可以进一步优化:
-
减少字符串转换:
- 字符串转换和字符比较可能会带来一些额外的开销。你可以考虑直接使用整数运算来判断一个整数是否是完美整数。
-
提前终止:
- 在
isPerfectInteger方法中,如果发现某个字符与第一个字符不同,可以立即返回false,这样可以减少不必要的比较。
- 在