Вычислить отношение разности максимума и минимума к среднему

66. Разделить разность максимума и минимума на среднее

Условие задачи:
Дан массив double[]. Необходимо вычислить разность максимального и минимального элементов и разделить её на среднее арифметическое:

(max - min) / average

При некорректных входных данных метод должен выбросить MyException.

Код:

public class Foo {

    public static double foo(
            double[] sourceArray
    ) throws MyException {
        // код тут
    }
}

Спойлеры к решению

Подсказки
💡 Минимум и максимум нельзя инициализировать нулём.
💡 Используй первый элемент массива как начальное значение.
💡 Сумму, минимум и максимум можно вычислить за один проход.
💡 Обработай пустой массив и значение null.
💡 Среднее арифметическое не должно быть равно нулю.

Решение
public class Foo {

    public static double foo(
            double[] sourceArray
    ) throws MyException {
        if (sourceArray == null || sourceArray.length == 0) {
            throw new MyException(
                    "Массив не должен быть пустым"
            );
        }

        double min = sourceArray[0];
        double max = sourceArray[0];
        double sum = 0;

        for (double element : sourceArray) {
            sum += element;
            min = Math.min(min, element);
            max = Math.max(max, element);
        }

        double average = sum / sourceArray.length;

        if (Double.compare(average, 0.0) == 0) {
            throw new MyException(
                    "Среднее арифметическое равно нулю"
            );
        }

        return (max - min) / average;
    }
}

Класс исключения:

public class MyException extends Exception {

    public MyException(String message) {
        super(message);
    }
}

Минимум и максимум инициализируются первым элементом, поэтому решение корректно работает как с положительными, так и с отрицательными числами.

Временная сложность — O(n), дополнительная память — O(1).