青训营X豆包MarsCode 技术训练营第五课 | 豆包MarsCode AI 刷题

28 阅读2分钟

问题分析

小S设计了一份问卷,要求快速找出每道题中最小的一个只出现一次的数字。如果每个数字都出现了多于一次,则返回 -1

问题转化

  1. 目标: 对于给定的数字数组 nums,找到其中出现次数为 1 的最小数字。
  2. 约束条件:
    • 如果所有数字的出现次数都大于 1,则返回 -1
    • 如果存在多个只出现一次的数字,返回其中最小的那个。

解决思路

  1. 统计每个数字的出现次数:

    • 使用哈希表(HashMap)来统计每个数字出现的次数。
    • 遍历数组 nums,将每个数字作为键,出现次数作为值存储在哈希表中。
  2. 查找最小只出现一次的数字:

    • 遍历哈希表,找到所有出现次数为 1 的数字。
    • 从这些数字中找出最小的那个。
  3. 特殊情况处理:

    • 如果没有数字出现次数为 1,则返回 -1

实现步骤

  1. 创建一个哈希表:

    • 使用 HashMap<Integer, Integer> 来存储每个数字的出现次数。
  2. 统计出现次数:

    • 遍历数组 nums,将每个数字的出现次数记录在哈希表中。
  3. 查找最小只出现一次的数字:

    • 遍历哈希表,找到所有出现次数为 1 的数字。
    • 从这些数字中找出最小的那个。
  4. 返回结果:

    • 如果找到符合条件的数字,返回该数字。
    • 否则,返回 -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
    }
}

代码解释

  1. 统计出现次数:

    • 使用 HashMap 统计每个数字的出现次数。
    • map.getOrDefault(num, 0) + 1 表示如果数字 num 已经在哈希表中,则将其出现次数加 1,否则初始化为 1
  2. 查找最小只出现一次的数字:

    • 初始化 minInteger.MAX_VALUE,用于记录最小的只出现一次的数字。
    • 遍历哈希表,找到所有出现次数为 1 的数字,并更新 min
  3. 返回结果:

    • 如果找到符合条件的数字,返回 min
    • 否则,返回 -1

测试结果

运行上述代码,输出结果如下:

true
true
true

这表明对于给定的测试样例,算法都能正确计算出最小只出现一次的数字。