LeetCode 347 给 一个字符串数组,统计每个字符串出现次数,返回出现次数最多的 Top K
这是我遇到的一个面试题,LeetCode上应该是整形数组,面试官改为了字符串数组,但是解法是一样的
1. 用哈希表 (C#中Dictionary)来存储数组中每个元素出现的次数
2. 把前面K个元素放入最小堆priorityQueue,循环剩下的元素,如果比堆顶元素大,就替换堆顶元素
代码如下
//给一个字符串数组,统计每个字符串出现次数,返回出现次数最多的 Top K
public static class Solution
{
public static string[] GetTopK(string[] strArr, int K)
{
if(strArr == null || strArr.Length == 0 || K <= 0) return Array.Empty<string>();
var strDic = new Dictionary<string,int>();
foreach(var str in strArr)
{
strDic.TryGetValue(str,out int strCount);
strDic[str] = strCount + 1;
}
if(strDic.Count < K)
{
K = strDic.Count;
}
var strHeap = new PriorityQueue<string,int>();
foreach(var strPair in strDic)
{
if(strHeap.Count <= K)
{
strHeap.Enqueue(strPair.Key,strPair.Value);
}
else
{
strHeap.TryPeek(out _,out int peekValue);
if(strPair.Value > peekValue)
{
strHeap.Dequeue();
strHeap.Enqueue(strPair.Key,strPair.Value);
}
}
}
var strResult = new string[strHeap.Count];
for(int i = strResult.Length - 1; i >= 0; i--)
{
strResult[i] = strHeap.Dequeue();
}
return strResult;
}
}
浙公网安备 33010602011771号