在整数数组中查找前3个最大重复数

时间:2012-09-12 05:02:22

标签: c#

我想在整数数组中找到前3个最大重复数?

以下是我尝试过的一段代码但我无法找到所需的结果:

static void Main(string[] args)
    {

      int[,] numbers = {
                           {1, 2, 0, 6 },
                           {5, 6, 7, 0 },
                           {9, 3, 6, 2 },
                           {6, 4, 8, 1 }
                        };           
        int count = 0;
        List<int> checkedNumbers = new List<int>();
        foreach (int t in numbers)
        {
            if (!checkedNumbers.Contains(t))
            {
               foreach (int m in numbers)                   
               {
                   if (m == t)                        
                      {   
                         count++;
                      }
                }
                Console.WriteLine("Number {0} is Repeated {1} Times ", t, count);
               count = 0;
                checkedNumbers.Add(t);
            }           
       }
        Console.ReadLine();
    }

4 个答案:

答案 0 :(得分:5)

您可以根据每个组中的计数使用LINQ中的GroupBy,然后使用OrderByDescending

var result = list.GroupBy(i => i)
                 .OrderByDescending(g => g.Count())
                 .Select(g => g.Key)
                 .Take(3);

修改:使用您的代码,您可以使用OfType展平您的矩阵,然后使用上面的代码:

int[,] numbers = {
                       {1, 2, 0, 6 },
                       {5, 6, 7, 0 },
                       {9, 3, 6, 2 },
                       {6, 4, 8, 1 }
                 };

var list = numbers.OfType<int>();

答案 1 :(得分:1)

int[] numbers = {1, 2, 3, 5, 6, 32, 2, 4, 42, 2, 4, 4, 5, 6, 3, 4};
var counts = new Dictionary<int, int>();
foreach (var number in numbers)
{
    counts[number] = counts[number] + 1;
}
var top3 = counts.OrderByDescending(x => x.Value).Select(x => x.Key).Take(3);

答案 2 :(得分:1)

<强>提示:

你可以在LINQ的帮助下做到这一点 这是找到大多数frequest出现元素的代码: -

List<int> list = new List<int>() { 1,1,2,2,3,4,5 };

// group by value and count frequency
var query = from i in list
            group i by i into g
            select new {g.Key, Count = g.Count()};

// compute the maximum frequency
int frequency = query.Max(g => g.Count);

// find the values with that frequency
IEnumerable<int> modes = query
                              .Where(g => g.Count == frequency)
                              .Select(g => g.Key);

// dump to console
foreach(var mode in modes) {
    Console.WriteLine(mode);
}

同样,你也可以找到另外两个。

答案 3 :(得分:1)

我看到现有的答案都没有提供解释,所以我会尝试解释。

您需要做的是计算每个项目在数组中出现的次数。为此,有各种方法(字典,linq等)。可能最简单的方法是使用包含数字的字典,以及它出现的次数:

int numbers[] = {1, 3, 6, 10, 9, 3, 3, 1, 10} ;
Dictionary<int, int> dic = new Dictionary<int, int>();

现在遍历数字中的每个元素,并将其添加到字典中。如果已添加,只需增加计数值。

foreach (var i in numbers)
{
    dic[i]++; // Same as dic[i] = dic[i]+1;
}

如果字词不存在,字典会自动添加新项目,因此我们只需dic[i]++;

接下来,我们需要获得最高的3个值。同样,有很多方法可以做到这一点,但最简单的方法就是对它进行排序。

var sorted_dic = dic.OrderByDescending(x => x.Value);

现在sorted_dic中的前3个项目将是您要查找的3个值。 有多种方法可以只获取这3个,例如使用Take方法:

var first_3 = sorted_dic.Take(3);

现在您可以遍历这3个值,例如在屏幕上打印它们:

foreach (var i in first_3)
{
    Console.Write("{0} appeared {1} times.", i.Key, i.Value);
}