Напишите программу для поиска индекса элемента Max в массиве - PullRequest
0 голосов
/ 30 ноября 2018

Напишите консольное приложение на C #, чтобы найти индекс i в массиве, который является максимальным числом в массиве.

Если максимальный элемент в массиве встречается несколько раз, необходимо отобразитьминимальный индекс.

Если массив пуст, выведите -1. ​​

Пожалуйста, дайте мне знать что не так в моем коде?

Если я, например, введу массив a = { 1, 2, 46, 14, 64, 64 };, он вернет 0, а должен будет возвращать 4.

  public static void Main()
  {
     double[] a = { 1, 9, 9, 8, 9, 2, 2 };
     Console.WriteLine(MaxIndex(a));
  }

  public static double MaxIndex(double[] array)
  {
     var max = double.MinValue;
     int maxInd = 0, maxCount = 0;
     int minIndex = 0;
     var min = double.MaxValue;
     for (var i = 0; i < array.Length; i++)
     {
        if (min > array[i])
        {
           min = array[i];
           minIndex = i;

        }
        if (max == array[i])
           maxCount++;
        if (max < array[i])
        {
           maxCount = 1;
           max = array[i];
           maxInd = i;
        }
     }

     if (array.Length == 0)
        return -1;
     if (maxCount > 1)
        return minIndex;
     return maxInd;
  }

Ответы [ 6 ]

0 голосов
/ 30 ноября 2018

Это не самый гламурный способ, но работает.

(должен использовать System.Linq;)

int maxValue = anArray.Max ();int maxIndex = anArray.ToList (). IndexOf (maxValue);

Ссылка: C # найти наибольшее значение массива и индекс

0 голосов
/ 30 ноября 2018

Ваш расчет верен, но вы возвращаете неправильную переменную minIndex вместо maxIndex.Не делайте больше, чем необходимо в методе.Это вычисляет также минимальный индекс и количество, как часто это появляется, тогда это ничего не делает с результатами.Вот компактная версия:

public static int MaxIndex(double[] array)
{
    var max = double.MinValue;
    int maxInd = -1;

    for (int i = 0; i < array.Length; i++)
    {
        if (max < array[i])
        {
            max = array[i];
            maxInd = i;
        }
    }

    return maxInd;
}

Он также устанавливает maxInd = -1, что было частью вашего требования.Поскольку MatthewWatson возражал против повторения double.MinValue в массиве, вот оптимизированная версия:

public static int MaxIndex(double[] array)
{
    if(array.Length == 0)
        return -1;
    else if (array.Length == 1)
        return 0;

    double max = array[0];
    int maxInd = 0;

    for (int i = 1; i < array.Length; i++)
    {
        if (max < array[i])
        {
            max = array[i];
            maxInd = i;
        }
    }

    return maxInd;
}

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

int minIndexOfMaxVal = a.Select((num, index) => new {num, index})
    .OrderByDescending(x => x.num)
    .Select(x => x.index)
    .DefaultIfEmpty(-1)
    .First();

Это работает со всеми типами последовательностей и типов не только с массивами и удваивается.

0 голосов
/ 30 ноября 2018

Возвращает ноль, потому что minIndex действительно равен нулю. Измените minIndex на maxIndex:

if (maxCount > 1) return maxIndex;

Для сравнения пар используйте следующий код вместо ==:

if (Math.Abs(a-b)<double.Epsilon)
0 голосов
/ 30 ноября 2018

В этом коде возможно много упрощений:

int? maxVal = null; // null because of array of negative value; 
int index = -1;

for (int i = 0; i < array.Length; i++)
{
  int current = array[i];
  if (!maxVal.HasValue || current > maxVal.Value)
  {
    maxVal = current ;
    index = i;
  }
}

Получит первый индекс максимального значения.Если вам просто нужен короткий код и вы не возражаете повторять дважды, простой linq может сделать это

var index = array.ToList().IndexOf(array.Max());
0 голосов
/ 30 ноября 2018

Попробуйте эту простую строку кода:

int[] numbers = { 1, 2, 3, 4, 5, 4, 3, 2, 1 };
var index = numbers.ToList().IndexOf(numbers.Max());

Я думаю, что код достаточно прост, чтобы быть понятным.

Однако, если вы стремитесь к производительности, преобразование в Listможет быть опущен, и вы можете написать собственный код, чтобы найти индекс максимального числа.

Или даже проще, предложенный @fubo:

Array.IndexOf(numbers, numbers.Max());
0 голосов
/ 30 ноября 2018

Ваш код в целом слишком сложен и содержит слишком много переменных для того, что он должен делать.

Вы хотите, чтобы индекс первого вхождения имел наибольшее значение, поэтому нет никакой реальной причиныхранить что угодно, кроме MaxValueIndex и MaxValue.

Все остальные переменные должны быть локальными, чтобы сборщик мусора мог их утилизировать.

Что касается того, что на самом деле не так с вашим кодом, я не могувыручить, так как имена переменных меня смущают.Но вот код, который достигает цели, которую вы хотите достичь.

double[] a = { 1, 9, 9, 8, 9, 2, 2 };
var highestValueInArray = a.Max();
var arrayLength = a.Length;

for (int i = 0; i < arrayLength; i++)
{
    if (a[i] == highestValueInArray)
    {
        Console.WriteLine(i);
        break;
    }
}

вместо того, чтобы вручную вычислять максимальное значение, вы можете просто использовать YourArray.Max(), чтобы получить самое высокое значение.

затем просто выполните итерацию по нему, как обычно, но в первый раз вы break; выйдете из цикла и вернете индекс, в котором он находится.

Я почти уверен, что есть также способ использовать FirstOrDefault в комбинациис IndexOf, но не смог заставить себя работать.

...