豆包MarsCode算法题:完美整数
问题描述
思路分析
问题拆解
-
遍历区间 [x, y]:
- 我们需要逐一检查
[x, y]
区间中的每个整数。
- 我们需要逐一检查
-
判断某个整数是否为完美整数:
- 方法1:将整数转为字符串,检查字符串中所有字符是否相同。
- 方法2:通过数学方式,提取每一位数字,判断是否相同。
-
计数:
- 如果当前数字是完美整数,则将计数器
count
加 1。
- 如果当前数字是完美整数,则将计数器
解题方法(在这里我用的是字符串方法)
-
方法1:字符串方法
- 将数字转为字符串,通过遍历字符判断是否所有字符相同。
- 示例:
- 数字 111 -> 字符串 “111” -> 每位字符相同,判定为完美整数。
- 数字 123 -> 字符串 “123” -> 字符不同,判定为非完美整数。
-
方法2:数学方法
- 提取数字的每一位,通过除法和取余操作判断所有位是否相同。
- 示例:
- 数字 111:
- 提取最低位:
111 % 10 = 1
- 依次除以 10 检查其余位:
(111 / 10) % 10 = 1
,结果一致。
- 提取最低位:
- 数字 123:
- 提取最低位:
123 % 10 = 3
- 继续检查
(123 / 10) % 10 = 2
,结果不一致。
- 提取最低位:
- 数字 111:
参考代码(Java)
public class Main {
public static int solution(int x, int y) {
int count = 0;
for (int i = x; i <= y; i++) {
if (isPerfectNumber(i)) {
count++;
}
}
return count;
}
// 判断一个整数是否是完美整数
private static boolean isPerfectNumber(int num) {
String str = Integer.toString(num);
char firstChar = str.charAt(0);
for (int i = 1; i < str.length(); i++) {
if (str.charAt(i) != firstChar) {
return false;
}
}
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
方法
public static int solution(int x, int y) {
int count = 0;
for (int i = x; i <= y; i++) {
if (isPerfectNumber(i)) {
count++;
}
}
return count;
}
- 功能:计算给定区间
[x, y]
中的完美整数数量。 - 输入参数:两个整数
x
和y
,表示区间的起点和终点。 - 实现逻辑:
- 遍历区间内的每个整数
i
。 - 调用辅助方法
isPerfectNumber
判断i
是否为完美整数。 - 若是完美整数,计数器
count
加 1。
- 遍历区间内的每个整数
- 输出:返回区间内完美整数的总数。
isPerfectNumber
方法
// 判断一个整数是否是完美整数
private static boolean isPerfectNumber(int num) {
String str = Integer.toString(num);
char firstChar = str.charAt(0);
for (int i = 1; i < str.length(); i++) {
if (str.charAt(i) != firstChar) {
return false;
}
}
return true;
}
- 功能:判断某个整数是否是完美整数。
- 输入参数:一个整数
num
。 - 实现逻辑:
- 将整数
num
转换为字符串形式str
。 - 获取字符串的第一个字符
firstChar
。 - 遍历字符串的其余部分,逐位检查每个字符是否都等于
firstChar
。 - 如果发现有不相同的字符,则返回
false
。 - 如果所有字符都相同,则返回
true
。
- 将整数
- 输出:返回布尔值,
true
表示是完美整数,false
表示不是。
关键逻辑
-
判断是否是完美整数:
String str = Integer.toString(num);
- 将数字转换为字符串形式,方便逐字符判断。
char firstChar = str.charAt(0);
- 获取字符串的第一个字符,用作参考值。
if (str.charAt(i) != firstChar)
- 遍历字符串的其余部分,逐位比较每个字符是否相同。
-
遍历区间:
for (int i = x; i <= y; i++)
- 从区间的起点
x
遍历到终点y
,确保所有整数都被检查。
- 从区间的起点
if (isPerfectNumber(i))
- 每次判断当前数字
i
是否是完美整数。
- 每次判断当前数字
-
计数和返回:
count++
:如果是完美整数,则计数器增加 1。return count;
:遍历结束后,返回计数器的值。