2014-08-19 5 views
0

Изучение C#, и я пытаюсь найти второй по величине массив в списке, вставленном пользователем. Я нашел решение в Интернете:Поиск второго большого массива

int second = int.MinValue; 
foreach (int i in playerScore) 
{ 
    if (i > largest) 
    { 
     second = largest; 
     largest = i; 
    } 
    else if (i > second) 
     second = i; 
} 

Но проблема в том, если два наибольшее число одни и те же цикл еще выплюнуть наибольшее число. Я не могу придумать способ отредактировать этот цикл, чтобы он нашел истинное второе наивысшее число в моем массиве. Будет ли такой цикл даже самым эффективным способом сделать это?

Благодаря

ответ

2

Просто измените

else if (i > second) 

к

else if (i > second && i != largest) 
+0

Спасибо! Если бы я хотел найти третье по величине число, я мог бы попробовать добавить в другое выражение if? Я пробовал общаться с ним, но я не могу заставить его работать правильно – CodingNub

1

Самый простой алгоритм (чтобы убедиться, что все в порядке):

  1. Сортируйте массив
  2. Loop через максимальное значение до тех пор, пока не найдете поменьше.

Но давайте проверим вашу петлю, чтобы она работала. Проблема заключается в строке else if (i > second), потому что если i==largest это правда. Так давайте изменим его else if (i > second && i<largest)

Полный код будет:

int second = int.MinValue; 
foreach (int i in playerScore) 
{ 
    if (i > largest) 
    { 
     second = largest; 
     largest = i; 
    } 
    else if (i > second && i<largest) 
     second = i; 
} 
0

Вы можете сделать это с помощью LINQ:

int second = playerScore.Distinct().OrderByDescending(x => x).Skip(1).First(); 
0

Вы должны просто добавить добавить еще одно условие к нему:

if(i == largest) { 
    continue; 
} 

Или, если вы хотите, чтобы начать работу с LINQ:

playerScore.Distinct().OrderByDescending(a => a).Take(2); 

Это поможет вам самые большие и 2-ой большие значения.

1

Вы можете использовать LINQ, как этот

var secondHighest = playerScore.Distinct().OrderByDescending(a => a).Skip(1).First(); 
-1

мне нравится это простое решение. Нет LINQ не требуется:

public static int FindSecondHighest(int [] ints) 
{ 
    // assumptions: 
    // minimum two ints in the array 
    // they're not all equal 
    // they're not negative 

    var highest = 0; 
    var secondHighest = 0; 

    foreach (int x in ints) 
    { 
     if (x >= highest) 
     { 
      secondHighest = highest; 
      highest = x; 
     } 
    } 

    return secondHighest; 
} 
0

Вы можете попробовать это: сделать коллекцию ДОПОЛНИТЕЛЬНОЕ, которая получает оригинал, разбирайтесь убывая (есть много встроенных в функции сортировки) и получить 2-го элемента. Надеюсь, это сработает для вас.

0

Если вы хотите получить второй по величине в списке, вы можете использовать LINQ (как уже было предложено). Так как вы хотите, чтобы иметь второе самое большое число (независимо от того, сколько раз наибольшее количество встречается,), вы можете сделать это так:

// sort decending: from the biggest to the smallest 
var sorted = y.OrderByDescending(x => x); 
// take the first element (which is the biggest) 
var largest = sorted.First(); 
// exclude the biggest element from the list and take the first one now (which will be the second biggest) 
var secondLargest = sorted.Where(x => x != largest).First(); 
0

Другой способ заключается в использовании LINQ, который я часто предпочитаю, чтобы увеличить читаемость.

Но проблема в том, если два наибольшее число одни и те же петля еще выплюнуть наибольшее количество

Тогда вы можете заказать массив и группу по количеству:

var secondGroup = playerScore 
    .OrderByDescending(i => i) // orders highest first 
    .GroupBy(i => i)    // builds groups of unique numbers 
    .Skip(1)      // you don't want the highest 
    .FirstOrDefault();   // get the second highest, if there is a second 
if (secondGroup != null) 
{ 
    int second = secondGroup.Key; 
} 

Это обрабатывает случаи, когда число символов меньше двух, или что наибольшее число не является уникальным.

0
int[] a=new int{1,2,3,4}; 
int firstbig=a[0]; 
int secondbig=a[1]; 
int p; 
for(int i=0;i<a.length;i++) 
{ 
    if(firstbig<a[i]) 
    { 
     firstbig=a[i]; 
     p=i; 
    } 
} 
for(int j=0;j<a.length;j++) 
{ 
    if(secondbig<a[j] && j!=p) 
    { 
    secondbig=a[j]; 

    } 
} 
Смежные вопросы