2009-11-28 6 views

Répondre

15

Essayez cette (LINQ):

int secondHighest = (from number in numbers 
        orderby number descending 
        select number).Skip(1).First(); 
+0

+ 1..LOL..Thats un bon. – Luke101

+0

Vous devriez pouvoir remplacer '.ToList() [0]' par '.First()'. –

+0

N'a pas pensé à ça, merci! – RCIX

2

Vous ne spécifiez pas si vous voulez le faire avec la complexité minimale.

Si l'on suppose votre tableau non trié, s'il vous plaît voir: How to find the kth largest element in an unsorted array of length n in O(n)?

Pour trouver Nième plus grand élément dans un tableau non trié: Construire un tas max en O (n). Maintenant, retirez k éléments du tas; où chaque retrait coûte log (n) le temps de maintenir le tas. Temps total complexité = O (n + klogn)

Pour comprendre la construction de tas Max en O (n) voir Binary heap

+0

Comment la complexité totale O (log k n) quand il y a un O (n) pas? –

+0

Qui se soucie de la complexité toale ou des tas binaires quand vous pouvez faire ce que vous voulez simplement avec LINQ? : D – RCIX

+0

Merci Jon. L'étape initiale pour construire le tas est O (n); les suppressions suivantes sont chacune O (logn). –

4

Oui, ont 2 vars (première et seconde) passthrough le tableau et chaque CompAir de temps ce que vous obtenez avec ces deux cellules (en mettant toujours le plus haut sur le premier et le deuxième le plus haut sur la seconde) avec un passage, vous obtiendrez le 2ème plus haut sur la deuxième var.

15

Vous pouvez trier la matrice et choisir l'élément au second index, mais la boucle O (n) suivante sera beaucoup plus rapide.

int[] myArray = new int[] { 0, 1, 2, 3, 13, 8, 5 }; 
int largest = int.MinValue; 
int second = int.MinValue; 
foreach (int i in myArray) 
{ 
    if (i > largest) 
    { 
     second = largest; 
     largest = i; 
    } 
    else if (i > second) 
     second = i; 
} 

System.Console.WriteLine(second); 
+3

vous pouvez aussi initialiser le plus grand et le deuxième à int.MinValue et faire aucune supposition;) – Martin

+0

quel est le but de 'else if'? –

+0

La boucle doit garder trace à la fois du plus grand et du deuxième entier le plus grand rencontré jusqu'ici. Le 'else if' gère le cas où le numéro de candidat n'est pas le plus grand, mais plutôt le deuxième plus grand qu'il a rencontré. –

0
int[] myArray = new int[] { 0, 1, 2, 3, 13, 8, 5 }; 
    int num1=0, temp=0; 
    for (int i = 0; i < myArray.Length; i++) 
    { 
     if (myArray[i] >= num1) 
     { 
      num1 = myArray[i]; 
     } 
     else if ((myArray[i] < num1) && (myArray[i] > temp)) 
     { 
      temp = myArray[i]; 
     } 
    } 
    Console.WriteLine("The Largest Number is: " + num1); 
    Console.WriteLine("The Second Highest Number is: " + temp); 
+1

Ces blocs de code résultent le plus haut ainsi que le deuxième nombre le plus élevé dans un tableau. –

+0

ce concept ne fonctionne pas –

0
int[] arr = { 1, 8, 4, 5, 12, 2, 5, 6, 7, 1, 90, 100, 56, 8, 34 }; 

int first, second; 
// Assuming the array has at least one element: 
first = second = arr[0]; 
for(int i = 1; i < arr.Length; ++i) 
{ 
    if (first < arr[i]) 
    { 
    // 'first' now contains the 2nd largest number encountered thus far: 
    second = first; 
    first = arr[i]; 
    } 

} 
MessageBox.Show(second.ToString()); 
+1

Votre Anwser est faux. Ça ne marchera pas. – gout

1
max1=0; 
max2=0; 

for(int i=0; i < a.Length; i++) 
{ 
    if (arr[i]> max1) 
    { 
     max2=max1; 
     max1=arr[i]; 
    } 
    else 
    { 
     if (a[i]!= max1) && (a[i] > max2) 
      max2[i]=arr[i]; 
    } 
} 
+0

maintenant c'est un code de travail, merci –

0
static void Main(string[] args) 
    { 
     int[] myArray = new int[] { 0, 1, 2, 3, 13, 8, 5,12,11,14 }; 
     int num1 = 0, temp = 0; 
     for (int i = 0; i < myArray.Length; i++) 
     { 
      if (myArray[i] >= num1) 
      { 
       temp = num1; 
       num1 = myArray[i]; 
      } 
      else if ((myArray[i] < num1) && (myArray[i] > temp)) 
      { 
       temp = myArray[i]; 
      } 
     } 
     Console.WriteLine("The Largest Number is: " + num1); 
     Console.WriteLine("The Second Highest Number is: " + temp); 
     Console.ReadKey(); 
    } 
1

Obtenir le nombre maximum d'abord, une fois que le max est modifiée faire une comparaison par rapport à la deuxième nombre élevé pour voir si elle a besoin d'échanger. La seconde instruction if vérifie si la valeur est inférieure à la valeur max et est supérieure à la deuxième valeur la plus élevée. En raison du court-circuit, si la première condition échoue, il quitte le si et saute

static void Main(string[] args) 
    { 
     //int[] arr = new int[10] { 9, 4, 6, 2, 11, 100, 53, 23, 72, 81 }; 
     int[] arr = { 1, 8, 4, 5, 12, 2, 5, 6, 7, 1, 90, 100, 56, 8, 34 }; 
     int MaxNum = 0; 
     int SecNum = 0; 
     for (int i = 0; i < arr.Length; i++) 
     { 
      if (arr[i] > MaxNum) 
      { 
       if (MaxNum > SecNum) { SecNum = MaxNum; } 
       MaxNum = arr[i]; 
      } 

      if (arr[i] < MaxNum && arr[i] > SecNum) 
      { 
       SecNum = arr[i]; 
      } 
     } 

     Console.WriteLine("Highest Num: {0}. Second Highest Num {1}.", MaxNum, SecNum); 
     Console.ReadLine(); 
    } 
Questions connexes