这是我的数组:
int myArray = new int[5];
myArray[0] = 1;
myArray[1] = 1;
myArray[2] = 1;
myArray[3] = 3;
myArray[4] = 5;
如果我想让程序找到这个数组的模式,我必须写什么?
这是一个LINQ解决方案:
int mode = myArray
.GroupBy(x => x)
.OrderByDescending(g => g.Count())
.First() // throws InvalidOperationException if myArray is empty
.Key;
这将按值对 的元素进行myArray
分组,按每组中值的数量对组进行排序,并获取第一组的值。如果有多个模式,那么这将采用 中首先出现的模式(具有最低索引)myArray
。
如果可能有多个模式并且您需要所有模式,那么您可以使用此变体:
var groups = myArray
.GroupBy(x => x)
.Select(g => new { Value = g.Key, Count = g.Count() })
.ToList(); // materialize the query to avoid evaluating it twice below
int maxCount = groups.Max(g => g.Count); // throws InvalidOperationException if myArray is empty
IEnumerable<int> modes = groups
.Where(g => g.Count == maxCount)
.Select(g => g.Value);
这将按值对元素进行分组myArray
,找到任何组中的最大值数,并获取具有该最大值数的每个组的值。
如果myArray
非常大,则第二个版本(即 O(n))可能比第一个版本(由于排序为 O(n log n))快。