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).