Помогите решить задачу C#

введите сюда описание изображения

В одномерном массиве, состоящем из n целых элементов, вычислить:

  • номер максимального элемента массива;
  • произведение элементов массива, расположенных между первым и вторым нулевыми элементами.

{
    int max = myArray.Max();
    int index = Array.FindLastIndex(myArray, delegate (int q) { return q == max; });
    Console.WriteLine("номер максимального элемента массива;: {0}", index);
    Console.ReadLine();
}

Ответы (2 шт):

Автор решения: aepot

Вот обе задачи в одном коде, я думаю, вы без труда сможете разделить.

static void Main(string[] args)
{
    Console.Write("Введите количество элементов массива: ");
    int length = int.Parse(Console.ReadLine());

    int[] myArray = new int[length];

    for (int i = 0; i < myArray.Length; i++)
    {
        Console.Write($"Введите элемент {i}: ");
        myArray[i] = int.Parse(Console.ReadLine());
    }

    int max = array[0];
    int maxIndex = 0;

    int zeroFirstIndex = -1;
    int zeroSecondIndex = -1;
    for (int i = 0; i < myArray.Length; i++)
    {
        if (max < array[i]) // ищем индекс максимального элемента
        {
            max = array[i];
            maxIndex = i;
        }

        if (array[i] == 0) // ищем индексы первого и второго нуля
        {
            if (zeroFirstIndex == -1)
                zeroFirstIndex = i;
            else if (zeroSecondIndex == -1)
                zeroSecondIndex = i;
        }
    }
    Console.WriteLine($"Индекс максимального элемента массива: {maxIndex}");

    if (zeroFirstIndex >= 0 && zeroSecondIndex >= 0) // если оба нуля найдены
    {
        int multiply;
        if (zeroSecondIndex - zeroFirstIndex == 1)
            multiply = 0;
        else
        {
            multiply = 1;
            for (int i = zeroFirstIndex + 1; i < zeroSecondIndex; i++)
                multiply *= array[i];
        }
        Console.WriteLine($"Произведение чисел между нулями: {multiply}");
    }
    else
        Console.WriteLine($"В массиве меньше двух нулей.");
}
→ Ссылка
Автор решения: pasx

Вот две версии алгоритма.

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

Вторая версия с LinQом.

        var max = int.MinValue;
        var maxIndex = -1;
        int? m  = null;
        var multiply = false;

        for (var index = 0; index < _data.Length; index++)
        {
            var i = _data[index];
            //compute max
            if (i > max)
            {
                max = i;
                maxIndex = index;
            }

            if (i == 0)
            {
                multiply = !multiply;
                if(m == null) m = 0;
                continue;
            }

            if (multiply)
            {
                if (m == 0) m = 1;
                m *= i;
            }
        }

        //Версия с LinQом

        var m2 = _data.SkipWhile(i => i != 0)
            .Skip(1)
            .TakeWhile(i => i != 0)
            .Aggregate((i, j) => i * j);

        var max2 = _data.Max();

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

→ Ссылка