牛客-NC97-字符串出现次数的TopK问题

NC97. 字符串出现次数的TopK问题(medium)



方法一:HashMap+Collections.sort()

思路:比较直接的做法是:将字符串数组遍历,并将元素放到HashMap中统计出现频率,接着最核心的来了–排序–需要调用Collections工具类来进行定制排序,即<mark>先比较值是否相同,相同按键升序进行比较,不相同按值降序比较</mark>,最后再取值即可,可以写出以下代码:

import java.util.*;


public class Solution {
   
    /** * return topK string * @param strings string字符串一维数组 strings * @param k int整型 the k * @return string字符串二维数组 */
    public String[][] topKstrings (String[] strings, int k) {
   
        // write code here
        // 特判
        if (k == 0) {
   
            return new String[][]{
   };
        }
        String[][] res = new String[k][2];
        HashMap<String, Integer> mappings = new HashMap<>();

        for (String str: strings) {
   
            if (mappings.containsKey(str)) {
   
                mappings.put(str, mappings.get(str) + 1);
            } else {
   
                mappings.put(str, 1);
            }
        }
        // 先比较值是否相同,相同按键升序进行比较,不相同按值降序比较
        List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(mappings.entrySet());
        Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() {
   
            public int compare(Map.Entry<String, Integer> o1,
                               Map.Entry<String, Integer> o2) {
   
                if (o1.getValue() == o2.getValue()) return o1.getKey().compareTo(o2.getKey());
                else return -Integer.compare(o1.getValue(), o2.getValue());
            }
        });

        for (int i = 0; i < k; i++) {
   
            res[i][0] = infoIds.get(i).getKey();
            res[i][1] = infoIds.get(i).getValue() + "";
        }

        return res;
    }
}

时间复杂度: O(NlogN),N表示字符串数组的长度。
空间复杂度: O(N),需要将字符串数组元素全部放入mappings中。

全部评论

相关推荐

10-15 09:13
已编辑
天津大学 soc前端设计
点赞 评论 收藏
分享
totoroyyw:千年老妖😂
投递华为等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务