我在这里找到的关于这个问题的答案只回答了一个最常见的元素。
我有一个填充随机数的int [10](0到20之间),我需要找到模式。但是随机的,有时会有多种模式,有时则没有。
目前我找到该模式的代码是:
int mode = numArray.GroupBy(v => v)
.OrderByDescending(g => g.Count())
.FirstOrDefault()
.Key;
这很有效,但如果说12和8都是最常见的,那么它只显示其中一个。
答案 0 :(得分:4)
我不喜欢这些代码,但认为这是最有效的方式:
int temp = -1;
var mode = numArray.GroupBy(v => v)
.OrderByDescending(g => g.Count())
.TakeWhile(g => {
if(temp == -1)
temp = g.Count();
return temp == g.Count(); })
.Select(g => g.Key)
.ToArray();
答案 1 :(得分:4)
var groups = numArray.GroupBy(v => v)
.OrderByDescending(g => g.Count())
.ToList();
IEnumerable<int> modes = groups.TakeWhile(g => g.Count() == groups.First().Count())
.Select(g => g.Key);
答案 2 :(得分:3)
一种(也许)更优雅的方法包括两次分组,一次按值,然后按计数:
var modes = numArray.GroupBy(i => i)
.GroupBy(numGroup => numGroup.Count(), numGroup => numGroup.Key)
.OrderByDescending(supergroup => supergroup.Key)
.First().ToArray();
答案 3 :(得分:1)
完成1次传球。得胜于最喜欢的答案!
public class PopularNumber
{
private Int32[] numbers = {5, 4, 3, 32, 6, 6, 3, 3, 2, 2, 31, 1, 32, 4, 3, 4, 5, 6};
public PopularNumber()
{
Dictionary<Int32,Int32> bucket = new Dictionary<Int32,Int32>();
Int32 maxInt = Int32.MinValue;
Int32 maxCount = 0;
Int32 count;
foreach (var i in numbers)
{
if (bucket.TryGetValue(i, out count))
{
count++;
bucket[i] = count;
}
else
{
count = 1;
bucket.Add(i,count);
}
if (count >= maxCount)
{
maxInt = i;
maxCount = count;
}
}
Console.WriteLine("{0},{1}",maxCount, maxInt);
}
}
答案 4 :(得分:0)
static int[] GetMostCommonIntegers(int[] nums)
{
return nums
.ToLookup(n => n)
.ToLookup(l => l.Count(), l => l.Key)
.OrderBy(l => l.Key)
.Last()
.ToArray();
}
此解决方案可以处理多个数字出现相同次数的情况:
[1,4,5,7,1] => [1]
[1,1,2,2,3,4,5] => [1,2]
[6,6,6,2,2,1] => [6]