2012-09-12 2 views
0

Je veux trouver les 3 premiers nombres maximum répétés dans un tableau d'entiers?Pour trouver les 3 premiers nombres maximum répétés dans un tableau d'entiers

est Ci-dessous le morceau de code que j'ai essayé, mais je ne pouvais pas trouver le résultat souhaité:

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(); 
    } 
+0

I J'ai posté mon code que j'ai essayé. Jetez un coup d'oeil et suggérez-moi si j'ai fait quelque chose de mal? –

+0

S'il vous plaît vérifier ma réponse avec votre code –

Répondre

5

Vous pouvez utiliser GroupBy de LINQ puis OrderByDescending en fonction du nombre dans chaque groupe:

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

Edit: votre code, vous pouvez utiliser OfType pour aplatir votre matrice puis utilisez-dessus du code :

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

var list = numbers.OfType<int>(); 
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); 
1

Conseil:

Vous pouvez le faire avec l'aide de LINQ.
Ceci est le code pour trouver plus fRequest élément se produisant: -

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); 
} 

De la même manière, vous pouvez trouver les deux autres aussi.

1

Je vois qu'aucune des réponses existantes ne fournit une explication, donc je vais essayer d'expliquer.

Ce que vous devez faire est de compter combien de fois chaque élément apparaît dans la matrice. Pour ce faire, il existe différentes méthodes (dictionnaires, linq, etc.). Probablement, il serait plus facile d'utiliser un dictionnaire qui contient le numéro, et comment peut fois il est apparu:

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

maintenant itérer tous les éléments en nombre, et l'ajouter au dictionnaire. Si cela a déjà été ajouté, augmentez simplement la valeur du compte.

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

Le dictionnaire ajoute automatiquement un nouvel élément si elle n'existe pas, donc nous pouvons simplement faire dic[i]++;

Ensuite, nous avons besoin d'obtenir les plus hauts 3 valeurs. Encore une fois, il y a plusieurs façons de le faire, mais la plus simple serait de le trier.

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

Maintenant, les 3 premiers articles dans sorted_dic vont être les 3 valeurs que vous recherchez. Il existe différentes méthodes pour obtenir que ces 3, par exemple en utilisant la méthode Take:

var first_3 = sorted_dic.Take(3); 

Maintenant, vous pouvez parcourir ces 3 valeurs, et par exemple les imprimer à l'écran:

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