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;

    }
}

  

posted on 2026-10-16 16:02  新西兰程序员  阅读(9)  评论(0)    收藏  举报