Типовые задачи с массивами: сумма, макс, мин, поиск, реверс

Урок разбирает классические алгоритмы обработки массива: сумму, среднее, поиск максимума и минимума, поиск элемента, подсчёт и разворот.

Перебор массива — последовательный проход по всем элементам в цикле — лежит в основе почти всех алгоритмов обработки данных.

Зачем учить типовые задачи

Большинство задач с массивами сводятся к нескольким повторяющимся приёмам. Научившись находить сумму, максимум и нужный элемент, вы получаете «кубики», из которых собираются решения куда более сложных задач. Эти алгоритмы — обязательная программа школьной информатики и постоянные гости на ОГЭ и ЕГЭ. Разберём их по одному, и вы увидите: за каждым стоит простая и понятная идея.

Во всех примерах будем работать с массивом из 6 чисел: 5, 8, 2, 9, 4, 7.

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

Здесь применяем знакомый шаблон накопления: заводим копилку sum, обнуляем, в цикле прибавляем каждый элемент. Среднее — это сумма, делённая на количество:

a = [5, 8, 2, 9, 4, 7]
sum = 0
for x in a:
    sum = sum + x
print('Сумма:', sum)
print('Среднее:', sum / len(a))

Вывод:

Сумма: 35
Среднее: 5.833333333333333

На Паскале тело цикла было бы sum := sum + a[i] при i от 1 до 6, а среднее считалось бы как sum / N (результат типа real).

Поиск максимума

Идея поиска максимума похожа на выбор самого высокого человека в строю: вы запоминаете первого как «пока самого высокого», потом сравниваете с каждым следующим и, если тот выше, запоминаете уже его. В коде: берём первый элемент как текущий максимум, затем проходим остальные и обновляем максимум, если встретили больший:

a = [5, 8, 2, 9, 4, 7]
max_val = a[0]              # считаем первый максимальным
for x in a:
    if x > max_val:
        max_val = x        # нашли больше — запоминаем
print('Максимум:', max_val)

Вывод:

Максимум: 9

Критически важная деталь: начальное значение максимума берут из самого массива (первый элемент), а не «с потолка» вроде 0. Если массив может содержать отрицательные числа, инициализация нулём дала бы неверный ответ. Минимум ищется зеркально: начинаем с первого элемента и обновляем, если встретили меньший (if x < min_val).

Поиск минимума и его позиции

Часто нужен не только сам минимум, но и его позиция (индекс) в массиве. Тогда заводим вторую переменную для индекса:

a = [5, 8, 2, 9, 4, 7]
min_val = a[0]
min_pos = 0
for i in range(len(a)):
    if a[i] < min_val:
        min_val = a[i]
        min_pos = i
print('Минимум', min_val, 'на позиции', min_pos + 1)
# +1, чтобы показать позицию как в Паскале (с 1)

Вывод:

Минимум 2 на позиции 3

Линейный поиск элемента

Задача: есть ли в массиве заданное число, и если да — где? Перебираем элементы и сравниваем с искомым. Заводим логический флаг «нашли» или запоминаем позицию:

a = [5, 8, 2, 9, 4, 7]
target = 9
found_at = -1                  # -1 означает 'не найдено'
for i in range(len(a)):
    if a[i] == target:
        found_at = i + 1       # позиция как в Паскале
        break                  # нашли — дальше искать незачем
if found_at != -1:
    print('Число', target, 'найдено на позиции', found_at)
else:
    print('Число не найдено')

Вывод:

Число 9 найдено на позиции 4

Этот алгоритм называется линейным поиском — мы идём по массиву подряд. Команда break здесь уместна: как только нашли, продолжать бессмысленно. Если бы нужно было посчитать все вхождения, break убрали бы и завели счётчик.

Подсчёт по условию

Очень частая задача — посчитать, сколько элементов удовлетворяют условию (например, чётных или больше 5). Шаблон: счётчик-копилка, обнуляем, в цикле увеличиваем при выполнении условия:

a = [5, 8, 2, 9, 4, 7]
count = 0
for x in a:
    if x > 5:
        count = count + 1
print('Элементов больше 5:', count)

Вывод:

Элементов больше 5: 3

Разворот массива (реверс)

Развернуть массив — значит поменять порядок элементов на обратный: первый становится последним и наоборот. Используем приём обмена через временную переменную из урока про присваивание. Идём навстречу с двух концов: меняем местами a[1] и a[N], затем a[2] и a[N-1], и так до середины:

a = [5, 8, 2, 9, 4, 7]
n = len(a)
for i in range(n // 2):
    temp = a[i]            # обмен через помощника
    a[i] = a[n - 1 - i]
    a[n - 1 - i] = temp
print('После разворота:', a)

Вывод:

После разворота: [7, 4, 9, 2, 8, 5]

Важно проходить только до середины (n div 2): если пройти весь массив, вы развернёте его дважды и вернёте в исходный вид. На Паскале цикл был бы for i := 1 to N div 2 do с обменом a[i] и a[N + 1 - i].

Попробуй сам

Дан массив 3, 7, 1, 9, 4, 6, 2. Найдите сумму только чётных элементов. Скомбинируйте шаблон накопления суммы с проверкой x mod 2 = 0. Проверьте на Python:

a = [3, 7, 1, 9, 4, 6, 2]
sum = 0
for x in a:
    if x % 2 == 0:
        sum = sum + x
print('Сумма чётных:', sum)

Вывод:

Сумма чётных: 12

Частые ошибки

  • Инициализация максимума нулём. Для поиска максимума/минимума берите начальным значением первый элемент массива, а не 0 — иначе на отрицательных данных получите неверный результат.
  • Реверс по всему массиву. Разворот делают до середины (n div 2); проход по всем элементам вернёт массив в исходное состояние.
  • Забыли обнулить счётчик/сумму. Копилку (sum, count) обязательно обнуляют до цикла.
  • Путают значение и индекс. При поиске различайте, что вам нужно: само значение элемента или его позицию в массиве.

Итоги

  • Сумма и среднее — шаблон накопления: обнулить, прибавлять в цикле, среднее = сумма / количество.
  • Максимум/минимум: начать с первого элемента и обновлять при встрече большего/меньшего.
  • Линейный поиск проходит массив подряд; найдя элемент, можно выйти через break.
  • Подсчёт по условию — счётчик, увеличиваемый при выполнении условия.
  • Реверс — обмен симметричных элементов через временную переменную, проход только до середины.
Проверьте себя
1. Каким значением правильно инициализировать переменную для поиска максимума?
AНулём
BПервым элементом массива
CЛюбым большим числом, например 1000
DРазмером массива
2. До какого индекса нужно идти при развороте (реверсе) массива?
AДо конца массива
BДо середины массива
CДо второго элемента
DРазворот не использует цикл
3. Зачем при линейном поиске элемента используют break?
AЧтобы посчитать все вхождения
BЧтобы выйти из цикла сразу после нахождения элемента, не перебирая остальные
CЧтобы обнулить массив
Dbreak здесь обязателен по синтаксису
Поддержать проект