确定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数组中最常见的元素

我不喜欢代码,但认为这是最有效的方法:

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]