#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, чтобы он напечатал второй элемент. Спасибо вам за вашу помощь!