查找热点数据问题| 豆包MarsCode AI刷题

65 阅读2分钟

解题思路

问题描述

给定一个整数数组 nums 和一个整数 k,返回数组中出现频率最高的 k 个元素,并按字母顺序排列。

解题步骤

  1. 统计频率

    • 使用 HashMap 统计数组中每个元素的出现频率。key值是数组中的元素,value值是该元素出现的次数。
  2. 转换为列表并排序

    • 哈希数组不支持直接排序,所以需要将 HashMap 中的键值对转换为列表,以便进行排序。
    • 按照值(频率)的降序对列表进行排序。
  3. 提取前 k 个元素

    • 从排序后的列表中提取前 k 个元素的键(即出现频率最高的 k 个元素)。
  4. 按字母顺序排列

    • 将提取的 k 个元素转换为字符数组,并按字母顺序进行排序(为了满足最后输出的答案是升序排列的)。
  5. 构建结果字符串

    • 将排序后的字符数组转换为字符串,并在每个元素之间添加逗号分隔符。

详细步骤

  1. 统计频率

    HashMap<Integer, Integer> hashmap = new HashMap<>();
    for (int item : nums) {
        if (!hashmap.containsKey(item)) {
            hashmap.put(item, 0);
        }
        hashmap.put(item, hashmap.get(item) + 1);
    }
    

    遍历数组 nums,并使用 HashMap 统计每个元素的出现次数。如果元素不在 HashMap 中,则将其添加到 HashMap 并初始化计数为 0。然后,每次遇到该元素时,将其计数加 1。

  2. 转换为列表并排序

    List<Map.Entry<Integer, Integer>> list = new ArrayList<>(hashmap.entrySet());
    Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
        public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
            return o2.getValue().compareTo(o1.getValue()); // 降序排序
        }
    });
    

    HashMap 中的键值对转换为列表 list,并使用 Collections.sort 方法按值(频率)的降序对列表进行排序。这里使用了一个自定义的 Comparator 来实现降序排序。

  3. 提取前 k 个元素

    StringBuilder res = new StringBuilder();
    for (int i = 0; i < k; i++) {
        res.append(list.get(i).getKey());
    }
    

    从排序后的列表中提取前 k 个元素的键,并将它们追加到 StringBuilder 对象 res 中。

  4. 按字母顺序排列

    String str = res.toString();
    char[] strlist = str.toCharArray();
    Arrays.sort(strlist);
    

    StringBuilder 对象 res 转换为字符串 str,然后将字符串转换为字符数组 strlist,并使用 Arrays.sort 方法按字母顺序对字符数组进行排序。

  5. 构建结果字符串

    StringBuilder result = new StringBuilder();
    for (int i = 0; i < k; i++) {
        result.append(strlist[i]);
        if (i < k - 1) {
            result.append(',');
        }
    }
    

    将排序后的字符数组 strlist 转换为字符串,并在每个元素之间添加逗号分隔符。最终结果存储在 StringBuilder 对象 result 中。

  6. 返回结果

    return result.toString();
    

    StringBuilder 对象 result 转换为字符串并返回。

使用AI思考:这道题目我思路相对清晰,主要问题在于不知道如何用java实现对哈希数组的排序,使用Collections.sort 方法按值(频率)的降序对列表进行排序,并重新定义一个 Comparator 来实现降序排序的解决办法是由AI提供的。