解题思路
问题描述
给定一个整数数组 nums 和一个整数 k,返回数组中出现频率最高的 k 个元素,并按字母顺序排列。
解题步骤
-
统计频率:
- 使用
HashMap统计数组中每个元素的出现频率。key值是数组中的元素,value值是该元素出现的次数。
- 使用
-
转换为列表并排序:
- 哈希数组不支持直接排序,所以需要将
HashMap中的键值对转换为列表,以便进行排序。 - 按照值(频率)的降序对列表进行排序。
- 哈希数组不支持直接排序,所以需要将
-
提取前
k个元素:- 从排序后的列表中提取前
k个元素的键(即出现频率最高的k个元素)。
- 从排序后的列表中提取前
-
按字母顺序排列:
- 将提取的
k个元素转换为字符数组,并按字母顺序进行排序(为了满足最后输出的答案是升序排列的)。
- 将提取的
-
构建结果字符串:
- 将排序后的字符数组转换为字符串,并在每个元素之间添加逗号分隔符。
详细步骤
-
统计频率:
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。 -
转换为列表并排序:
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来实现降序排序。 -
提取前
k个元素:StringBuilder res = new StringBuilder(); for (int i = 0; i < k; i++) { res.append(list.get(i).getKey()); }从排序后的列表中提取前
k个元素的键,并将它们追加到StringBuilder对象res中。 -
按字母顺序排列:
String str = res.toString(); char[] strlist = str.toCharArray(); Arrays.sort(strlist);将
StringBuilder对象res转换为字符串str,然后将字符串转换为字符数组strlist,并使用Arrays.sort方法按字母顺序对字符数组进行排序。 -
构建结果字符串:
StringBuilder result = new StringBuilder(); for (int i = 0; i < k; i++) { result.append(strlist[i]); if (i < k - 1) { result.append(','); } }将排序后的字符数组
strlist转换为字符串,并在每个元素之间添加逗号分隔符。最终结果存储在StringBuilder对象result中。 -
返回结果:
return result.toString();将
StringBuilder对象result转换为字符串并返回。
使用AI思考:这道题目我思路相对清晰,主要问题在于不知道如何用java实现对哈希数组的排序,使用Collections.sort 方法按值(频率)的降序对列表进行排序,并重新定义一个 Comparator 来实现降序排序的解决办法是由AI提供的。