← Назад к вопросам
Нахождение максимального элемента
1.8 Middle🔥 191 комментариев
#Теория тестирования
Условие
Напишите функцию, которая находит максимальный элемент в массиве без использования встроенных функций.
Пример
Вход: [3, 7, 2, 9, 1, 5] Выход: 9
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение: Нахождение максимального элемента в массиве
Описание проблемы
Нужно найти наибольший элемент в массиве, не использоваихая встроенные функции типа max(). Это фундаментальная задача, проверяющая понимание итерации, сравнения и логики управления состоянием. Рассмотрю несколько подходов с разными уровнями оптимизации.
Подход 1: Простой линейный поиск
def find_maximum(arr):
"""
Находит максимум простой итерацией по всем элементам.
Args:
arr: List[int] - массив целых чисел
Returns:
int - максимальный элемент
Raises:
ValueError - если массив пуст
"""
if not arr: # Обработка пустого массива
raise ValueError("Массив не может быть пустым")
max_value = arr[0] # Инициализируем первым элементом
for i in range(1, len(arr)): # Начинаем со второго элемента
if arr[i] > max_value:
max_value = arr[i]
return max_value
# Примеры
print(find_maximum([3, 7, 2, 9, 1, 5])) # 9
print(find_maximum([10])) # 10
print(find_maximum([-5, -2, -10])) # -2
Подход 2: С возвращением индекса
def find_maximum_with_index(arr):
"""
Возвращает максимальный элемент и его индекс.
Полезно когда нужно знать позицию элемента.
"""
if not arr:
raise ValueError("Массив не может быть пустым")
max_value = arr[0]
max_index = 0
for i in range(1, len(arr)):
if arr[i] > max_value:
max_value = arr[i]
max_index = i
return max_value, max_index
# Пример
value, index = find_maximum_with_index([3, 7, 2, 9, 1, 5])
print(f"Максимум: {value} на позиции {index}") # Максимум: 9 на позиции 3
Подход 3: Через reduce (Функциональный)
from functools import reduce
def find_maximum_functional(arr):
"""
Использует функциональный подход с reduce.
Элегантно, но менее читаемо для beginners.
"""
if not arr:
raise ValueError("Массив не может быть пустым")
return reduce(lambda max_val, current:
max_val if max_val > current else current,
arr)
print(find_maximum_functional([3, 7, 2, 9, 1, 5])) # 9
Подход 4: Декомпозиция на подмассивы
def find_maximum_divide_conquer(arr, left=0, right=None):
"""
Рекурсивный подход "разделяй и властвуй".
Демонстрирует понимание рекурсии, но неэффективен практически.
"""
if right is None:
right = len(arr) - 1
# Базовый случай: один элемент
if left == right:
return arr[left]
# Базовый случай: два элемента
if right == left + 1:
return arr[left] if arr[left] > arr[right] else arr[right]
# Рекурсивный случай
mid = (left + right) // 2
left_max = find_maximum_divide_conquer(arr, left, mid)
right_max = find_maximum_divide_conquer(arr, mid + 1, right)
return left_max if left_max > right_max else right_max
print(find_maximum_divide_conquer([3, 7, 2, 9, 1, 5])) # 9
Подход 5: С минимальными сравнениями (Оптимизация)
def find_maximum_optimized(arr):
"""
Оптимизированный вариант для больших массивов.
Минимизирует количество сравнений.
"""
if not arr:
raise ValueError("Массив не может быть пустым")
n = len(arr)
max_value = arr[0]
# Обработка пар элементов за раз
i = 1
while i < n:
# Сравниваем пару между собой, потом больший с max
if i + 1 < n:
if arr[i] > arr[i + 1]:
if arr[i] > max_value:
max_value = arr[i]
else:
if arr[i + 1] > max_value:
max_value = arr[i + 1]
i += 2
else:
# Нечётный элемент
if arr[i] > max_value:
max_value = arr[i]
i += 1
return max_value
print(find_maximum_optimized([3, 7, 2, 9, 1, 5])) # 9
Сравнение подходов
| Подход | Временная сложность | Пространственная | Читаемость | Использование |
|---|---|---|---|---|
| Линейный | O(n) | O(1) | Отлично | Production |
| С индексом | O(n) | O(1) | Отлично | Часто нужно |
| Functional | O(n) | O(n) | Среднее | Стиль кода |
| Divide & Conquer | O(n) | O(log n) | Плохо | Обучение |
| Оптимизированный | O(n) | O(1) | Среднее | Редко нужна |
Анализ сложности
Временная: O(n) — требуется проверить каждый элемент в худшем случае Пространственная: O(1) — используем только константное количество переменных (для итеративного подхода)
Не существует алгоритма быстрее O(n) для неотсортированного массива, т.к. нужно проверить каждый элемент.
Граничные случаи
# Тестовые сценарии
test_cases = [
([3, 7, 2, 9, 1, 5], 9), # Обычный случай
([10], 10), # Один элемент
([1, 1, 1], 1), # Все элементы одинаковые
([-5, -2, -10], -2), # Отрицательные числа
([0, -5, 3], 3), # Смешанные значения
]
for arr, expected in test_cases:
result = find_maximum(arr)
assert result == expected, f"Ошибка: ожидалось {expected}, получено {result}"
print(f"✓ Тест прошёл для {arr}")
Практическое применение в QA Automation
- Поиск максимального времени выполнения тестов
- Нахождение наибольшего размера файла в загруженном наборе
- Поиск максимального ID элемента при проверке базы данных
- Валидация граничных значений в API тестах
- Мониторинг максимальных значений метрик производительности
- Анализ логов для поиска критических ошибок с наивысшим уровнем severity