我今天进行了第一次实习技术考试,其中一个问题是: 给定一个整数列表,找到列表中出现最多的整数。如果两个或更多整数绑定最多的外观,则返回最高的整数。 我确信通过实现哈希表可以在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)时间内解决这个问题吗?
答案 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);