牛客-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中。

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-27 15:19
简历上能写3个月吗?
码农索隆:大胆写,主要你能把实习经历包装好,可以看一下我这篇帖子https://www.nowcoder.com/share/jump/4888395581180798063
点赞 评论 收藏
分享
晗江雪:其实我只是觉得你们导员说的很好笑
点赞 评论 收藏
分享
见见123:简历没有啥问题,是这个社会有问题。因为你刚毕业,没有工作经历,现在企业都不要没有工作经历的。社会病了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务