2012-09-12 2 views
0

정수 배열에서 최대 3 개의 반복 수를 찾고 싶습니까? 다음은 정수 배열에서 상위 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(); 
    } 
+0

I 내가 시도한 코드를 게시했습니다. 내가 틀린 것을 한 번 해봤습니까? –

+0

코드로 내 대답을 확인하십시오. –

답변

5

당신은 각 그룹의 개수에 다음 OrderByDescending를 기반으로 LINQ에서 GroupBy를 사용할 수 있습니다

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
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

힌트 :

당신은의 도움으로이 작업을 수행 할 수 있습니다 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); 
} 

.

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 가지 값입니다. 거기 Take 방법을 사용하여 실시 예 만이 3를 얻기 위해 다양한 방법입니다 :

var first_3 = sorted_dic.Take(3); 

지금 당신이이 세 값을 반복 할 수는, 예를 들어 화면을 인쇄 :

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