Считайте второе по величине число в массиве

#c# #arrays

Вопрос:

Я написал консольное приложение (.NET 5.0) на C# в Visual Studio, которое сортирует массив от высокого до низкого, а затем должно распечатать второй по величине элемент в этом массиве.

Я приближаюсь, но я пробовал что-то в течение последних 2 часов, и я не понимаю, почему я всегда получаю ошибку за пределами границ в последнем «если». Программа должна обнаруживать дубликаты, например, если ввод ‘1 1 2 2 5 5 9 9″ он выведет цифру «5», так как является вторым по величине.

Мой текущий код приведен ниже, я не могу заставить его работать без сбоев

использование Системы;

 namespace second_largest
{
    class Program
    {
        static void Main(string[] args)
        {
            double[] input = Array.ConvertAll(Console.ReadLine().Split(" "), Convert.ToDouble);

            for (int repeat = 0; repeat < input.Length; repeat  )
            {
                for (int j = 0; j < input.Length - 1; j  )
                {
                    if(input[j] < input[j 1])
                    {
                        double temp = input[j];
                        input[j] = input[j   1];
                        input[j   1] = temp;
                    }
                }
            }

            for (int i = 0; i < input.Length; i  )
            {
                if(input[i] == input[i   1])
                {

                }
                else
                {
                    Console.WriteLine(input[i]);
                }
                Console.WriteLine(input[i]);
            }
        }
    }
}
 

Комментарии:

1. c-sharpcorner.com/code/3108/… Хороший пример того, как это сделать

2. if(input[i] == input[i 1]) здесь i 1 индекс th находится вне диапазона, так как у вас есть for (int i = 0; i < input.Length; i ) цикл

Ответ №1:

Существует гораздо более простой способ получить второе место с помощью LINQ

Это включает группировку по номеру (для устранения дубликатов), затем упорядочивание по сгруппированному ключу по убыванию, затем пропуск одного и взятие одного

 var secondHighest = nums.GroupBy(n => n)
                        .OrderByDescending(n => n.Key)
                        .Skip(1)
                        .First()
                        .Key;
 

Живой пример: https://dotnetfiddle.net/WlFyWr

Комментарии:

1. хорошо, спасибо! Я займусь этим, этим. На первый взгляд выглядит сбивающим с толку

2. вы получите nums , группы ее элементы n так, что у вас есть только каждый элемент один раз ( UNIQUE ), а затем того, по убыванию по ключам (ключи равны их значения, потому что вы сгруппировали их по их значениям; ключ для группы 1 является 1 ), то пропустите первый (большой) элемент (это вроде удалил из запроса), а затем получить первый (спасибо skip(1) , первый элемент теперь является вторым по величине из исходного массива), затем получить ключ этого элемента, потому что помню, ключи равны значения.

Ответ №2:

Вы видите ошибку, потому что вы выполняете итерацию до i < input.Length , что означает, что i 1 следующий оператор if выходит за пределы длины входного массива. Вам нужно сделать то же самое, что вы делали в предыдущем вложенном цикле for:

for(int i = 0; i < input.Length - 1; i )

Комментарии:

1. ах, я нашел способ сделать это, я добавил счетчик, который просто считает до 2, чтобы он напечатал второй элемент. Спасибо вам за вашу помощь!