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

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

      • 方法一:HashMap+Collections.sort()

牛客-NC97-字符串出现次数的TopK问题_第1张图片
牛客-NC97-字符串出现次数的TopK问题_第2张图片

方法一:HashMap+Collections.sort()

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

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

你可能感兴趣的:(牛客(剑指OFFER),LeetCode刷题,字符串,数据结构,hashmap,leetcode)