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; } }