2

这是我的数组:

int myArray = new int[5];

myArray[0] = 1;
myArray[1] = 1;
myArray[2] = 1;
myArray[3] = 3;
myArray[4] = 5;

如果我想让程序找到这个数组的模式,我必须写什么?

4

1 回答 1

8

这是一个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))快。

于 2013-11-02T02:32:44.657 回答