哈希表,用于查找列表中出现次数最多的数字

时间:2017-03-10 19:28:31

标签: c# hash

我今天进行了第一次实习技术考试,其中一个问题是: 给定一个整数列表,找到列表中出现最多的整数。如果两个或更多整数绑定最多的外观,则返回最高的整数。 我确信通过实现哈希表可以在O(n)时间内解决特定问题。但是,我无法提出工作代码,最终得到了一个O(nlogn)解决方案:

        var groups = myList.GroupBy(v => v);
        groups = groups.OrderByDescending(v => v.Count());
        int max = groups.First().Key;
        int maxCounts = groups.First().Count();
        foreach (var group in groups)
        {
            var groupKey = group.Key;
            var counts = group.Count();
            if (counts < maxCounts) break;
            if (groupKey > max) max = groupKey; 
        }
        Console.WriteLine(max);

有人可以提供工作代码,最好是在实现哈希表的C#中,以便在O(n)时间内解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您可以通过循环遍历数组填充频率哈希表,然后遍历哈希表,跟踪最大值和最大频率:

int[] arr = {1,2,3,4,1,2,3,4,3,4};
var frequency = new Dictionary<int, int>();

foreach(var x in arr) 
{
    if(!frequency.ContainsKey(x)) frequency.Add(x, 0);
    frequency[x] += 1;
}

var bestKey = frequency.First().Key;
var bestValue = frequency.First().Value;

foreach(var p in frequency.Skip(1))
{
    if(p.Key > bestKey && p.Value >= bestValue)
    {
        bestKey = p.Key; 
        bestValue = p.Value;
    }
}

Console.WriteLine("Key={0}, Value={1}", bestKey, bestValue);

live wandbox example