确定int数组中最常见的元素
本文关键字:常见 元素 int 数组 确定 | 更新日期: 2023-09-27 18:04:57
我在这里发现的关于这个问题的答案只返回了最常见的元素之一。
我有一个充满随机数(介于0和20之间(的int[10],我需要找到模式。但作为随机的,有时有不止一种模式,有时没有。
目前我查找模式的代码是:
int mode = numArray.GroupBy(v => v)
.OrderByDescending(g => g.Count())
.FirstOrDefault()
.Key;
这非常有效,但如果说12和8都出现得最常见,它只显示了其中一个。
我不喜欢代码,但认为这是最有效的方法:
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();
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);
一种(也许(更优雅的方法包括两次分组,一次按值分组,然后按计数分组:
var modes = numArray.GroupBy(i => i)
.GroupBy(numGroup => numGroup.Count(), numGroup => numGroup.Key)
.OrderByDescending(supergroup => supergroup.Key)
.First().ToArray();
一次通过。一定比最喜欢的答案更好!
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);
}
}
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]