问题分析
小S设计了一份问卷,要求快速找出每道题中最小的一个只出现一次的数字。如果每个数字都出现了多于一次,则返回 -1。
问题转化
- 目标: 对于给定的数字数组
nums,找到其中出现次数为1的最小数字。 - 约束条件:
- 如果所有数字的出现次数都大于
1,则返回-1。 - 如果存在多个只出现一次的数字,返回其中最小的那个。
- 如果所有数字的出现次数都大于
解决思路
-
统计每个数字的出现次数:
- 使用哈希表(
HashMap)来统计每个数字出现的次数。 - 遍历数组
nums,将每个数字作为键,出现次数作为值存储在哈希表中。
- 使用哈希表(
-
查找最小只出现一次的数字:
- 遍历哈希表,找到所有出现次数为
1的数字。 - 从这些数字中找出最小的那个。
- 遍历哈希表,找到所有出现次数为
-
特殊情况处理:
- 如果没有数字出现次数为
1,则返回-1。
- 如果没有数字出现次数为
实现步骤
-
创建一个哈希表:
- 使用
HashMap<Integer, Integer>来存储每个数字的出现次数。
- 使用
-
统计出现次数:
- 遍历数组
nums,将每个数字的出现次数记录在哈希表中。
- 遍历数组
-
查找最小只出现一次的数字:
- 遍历哈希表,找到所有出现次数为
1的数字。 - 从这些数字中找出最小的那个。
- 遍历哈希表,找到所有出现次数为
-
返回结果:
- 如果找到符合条件的数字,返回该数字。
- 否则,返回
-1。
代码实现
import java.util.HashMap;
import java.util.Map;
public class Main {
public static int solution(int n, int[] nums) {
// 创建一个哈希表来统计每个数字的出现次数
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
// 初始化最小值为最大值
int min = Integer.MAX_VALUE;
boolean found = false;
// 遍历哈希表,找到出现次数为1的最小数字
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
if (entry.getKey() < min) {
min = entry.getKey();
}
found = true;
}
}
// 如果没有找到只出现一次的数字,返回-1
if (!found) {
return -1;
}
return min;
}
public static void main(String[] args) {
System.out.println(solution(3, new int[]{6, 6, 6}) == -1); // 输出: true
System.out.println(solution(3, new int[]{6, 9, 6}) == 9); // 输出: true
System.out.println(solution(5, new int[]{1, 2, 2, 3, 3}) == 1); // 输出: true
}
}
代码解释
-
统计出现次数:
- 使用
HashMap统计每个数字的出现次数。 map.getOrDefault(num, 0) + 1表示如果数字num已经在哈希表中,则将其出现次数加1,否则初始化为1。
- 使用
-
查找最小只出现一次的数字:
- 初始化
min为Integer.MAX_VALUE,用于记录最小的只出现一次的数字。 - 遍历哈希表,找到所有出现次数为
1的数字,并更新min。
- 初始化
-
返回结果:
- 如果找到符合条件的数字,返回
min。 - 否则,返回
-1。
- 如果找到符合条件的数字,返回
测试结果
运行上述代码,输出结果如下:
true
true
true
这表明对于给定的测试样例,算法都能正确计算出最小只出现一次的数字。