1. 程式人生 > 其它 >NC97 字串出現次數的TopK問題

NC97 字串出現次數的TopK問題

NC97 字串出現次數的TopK問題
描述
給定一個字串陣列,再給定整數k,請返回出現次數前k名的字串和對應的次數。
返回的答案應該按字串出現頻率由高到低排序。如果不同的字串有相同出現頻率,按字典序排序。
對於兩個字串,大小關係取決於兩個字串從左到右第一個不同字元的 ASCII 值的大小關係。
比如"ah1x"小於"ahb","231"<”32“
字元僅包含數字和字母

[要求]
如果字串陣列長度為N,時間複雜度請達到O(N \log K)O(NlogK)

示例1
輸入:
["a","b","c","b"],2
返回值:
[["b","2"],["a","1"]]
說明:
"b"出現了2次,記["b","2"],"a"與"c"各出現1次,但是a字典序在c前面,記["a","1"],最後返回[["b","2"],["a","1"]]

示例2
輸入:
["123","123","231","32"],2
返回值:
[["123","2"],["231","1"]]
說明:
"123"出現了2次,記["123","2"],"231"與"32"各出現1次,但是"231"字典序在"32"前面,記["231","1"],最後返回[["123","2"],["231","1"]]
示例3
輸入:
["abcd","abcd","abcd","pwb2","abcd","pwb2","p12"],3
返回值:[["abcd","4"],["pwb2","2"],["p12","1"]]

解題思路:這道題倒是沒有什麼難度,就是統計字串出現次數然後取出前K個即可。這裡主要是用到了Map.Entry<K,V>這種資料結構,比較罕見,記下來,因為我一開始使用pair的,發現牛客用不了這種資料結構。用了Map.Entry<K,V>這種結構就解決了。

程式碼

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
        HashMap<String, Integer> map = new HashMap<>();
        for (String string : strings) {
            Integer cnt = map.getOrDefault(string, 0);
            map.put(string, cnt+1);
        }
        ArrayList<Map.Entry<String, Integer>> entries = new ArrayList<>(map.entrySet());
        Collections.sort(entries,(Map.Entry<String, Integer> entry1, Map.Entry<String, Integer> entry2)->{
            if(entry1.getValue()==entry2.getValue()){
                return entry1.getKey().compareTo(entry2.getKey());
            }else{
                return entry2.getValue() - entry1.getValue();
            }
        });

        String[][] res = new String[k][2];
        for(int i=0; i<k; i++){
            Map.Entry<String, Integer> entry = entries.get(i);
            res[i][0] = entry.getKey();
            res[i][1] = String.valueOf(entry.getValue());
        }
        return res;
    }
}