← Назад к вопросам

Среднее арифметическое

2.0 Middle🔥 171 комментариев
#Теория тестирования

Условие

Напишите функцию, которая вычисляет среднее арифметическое элементов массива.

Пример

Вход: [10, 20, 30, 40, 50] Выход: 30.0

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Анализ задачи

Нужно вычислить среднее арифметическое элементов массива. Формула:

Average = (сумма всех элементов) / (количество элементов)

Задача проста на первый взгляд, но требует учитывать граничные случаи.

Решение 1: Простое вычисление

def average(arr):
    if not arr:
        return 0  # Или raise ValueError
    total = 0
    for num in arr:
        total += num
    return total / len(arr)

Пояснение:

  • Сначала проверяем что массив не пуст
  • Суммируем все элементы
  • Делим на количество элементов

Пример:

[10, 20, 30, 40, 50]
сумма = 150
количество = 5
среднее = 150 / 5 = 30.0

Решение 2: С использованием встроенных функций

def average(arr):
    if not arr:
        return 0
    return sum(arr) / len(arr)

Более читаемо и эффективно в Python.

Решение 3: С обработкой ошибок

def average(arr):
    if not arr:
        raise ValueError("Массив не может быть пуст")
    
    if not all(isinstance(x, (int, float)) for x in arr):
        raise TypeError("Все элементы должны быть числами")
    
    return sum(arr) / len(arr)

Преимущества:

  • Явная обработка ошибок
  • Проверка типов

Решение 4: Java реализация

public class ArrayAverage {
    public static double average(int[] arr) {
        if (arr.length == 0) {
            throw new IllegalArgumentException("Массив не может быть пуст");
        }
        
        int sum = 0;
        for (int num : arr) {
            sum += num;
        }
        
        return (double) sum / arr.length;
    }
}

Решение 5: JavaScript

function average(arr) {
    if (arr.length === 0) return 0;
    return arr.reduce((sum, num) => sum + num) / arr.length;
}

Важные моменты

1. Деление на ноль:

# Неправильно
def average(arr):
    return sum(arr) / len(arr)  # Ошибка если arr пуст!

# Правильно
def average(arr):
    if not arr:
        return 0  # или raise exception
    return sum(arr) / len(arr)

2. Целое число vs дробь:

# Результат всегда float
print(average([10, 20, 30]))  # 20.0 (float)

3. Переполнение памяти (для больших массивов):

def average_safe(arr):
    if not arr:
        return 0
    # Считаем среднее по мере итерации (избегаем overflow)
    mean = 0
    for i, num in enumerate(arr):
        mean += (num - mean) / (i + 1)
    return mean

Тестовые случаи

assert average([10, 20, 30, 40, 50]) == 30.0
assert average([1]) == 1.0
assert average([5, 5, 5, 5]) == 5.0
assert average([-10, 0, 10]) == 0.0
assert average([1.5, 2.5, 3.0]) == 2.333...
assert average([]) == 0  # или exception
assert average([100, 200]) == 150.0
assert average([-1, -2, -3]) == -2.0

Граничные случаи

  1. Пустой массив - должен вернуть 0 или выбросить исключение
  2. Один элемент - должен вернуть это же число
  3. Отрицательные числа - должны учитываться
  4. Дроби - результат должен быть float
  5. Очень большие числа - проверить переполнение
  6. Очень длинные массивы - проверить производительность

Сложность

АспектЗначение
Временная сложностьO(n)
Пространственная сложностьO(1)
СтабильностьДаже без пустого массива

Рекомендация для QA Automation

При тестировании:

  1. Базовые случаи - простые массивы с положительными числами
  2. Граничные случаи - пустой, один элемент, отрицательные
  3. Типы данных - целые, дроби
  4. Точность - сравнивайте с небольшим допуском (epsilon)
  5. Производительность - на массивах 10^7 элементов

На собеседовании

  1. Начните с простого решения
  2. Упомяните обработку пустого массива
  3. Обсудите типы данных (int vs float)
  4. Объясните сложность O(n)
  5. Предложите оптимизацию для больших данных (Welford's algorithm)