Обработка символьных строк и числовых последовательностей (ЕГЭ, задания 17, 24)
Коротко о главном
Задания 17 и 24 объединяет одно умение — читать данные из файла (числа или текст) и обрабатывать их по циклу с накоплением результата.
- Задание 17 — большая числовая последовательность (обычно 10³–10⁶ чисел). Нужно найти пары/тройки чисел с заданными условиями (сумма, произведение, четность, кратность) и посчитать что-то по ним (максимум суммы, количество пар и т.п.).
- Задание 24 — длинная символьная строка (текст). Нужно найти количество вхождений подстрок, самую длинную/короткую последовательность одинаковых символов, заменить символы по правилу и т.д.
Общий алгоритм: открыть файл → прочитать данные → пройтись циклом с накоплением условия → вывести ответ.
Определения и формулы/правила
| Понятие | Смысл | Пример |
|---|---|---|
| Последовательность | Набор чисел , читаемых из файла | 1 5 -3 8 2 ... |
| Подпоследовательность (17) | Непрерывный или несмежный набор элементов с условием | пара : |
| Подстрока (24) | Непрерывный набор символов строки | в abccba подстрока cc |
| Максимальная серия | Самый длинный участок одинаковых/монотонных элементов | 1112111 → серия из 3 единиц |
| Индексация | Символы строки нумеруются с 1 (в задачах ЕГЭ) или с 0 (в Python) | — первый символ |
Правило поиска пары с условием (17):
где — знак условия: >, <, %, чётность и т.д.
Правило подсчёта серии одинаковых символов (24):
и на каждом шаге сравнивать len с текущим максимумом maxlen.
Формула суммы/количества по условию: где — индикатор (1, если условие выполнено, иначе 0).
Как применять
Пример 1 (задание 17). Найти количество пар соседних чисел, оба кратных 3, и сумму максимальной такой пары.
with open('17.txt') as f:
a = [int(x) for x in f.read().split()]
count = 0
max_sum = 0
for i in range(len(a) - 1):
if a[i] % 3 == 0 and a[i+1] % 3 == 0:
count += 1
max_sum = max(max_sum, a[i] + a[i+1])
print(count, max_sum)
Пример 2 (задание 17). Найти пару чисел (не обязательно соседних), одно чётное, другое нечётное, с максимальным произведением.
even = [x for x in a if x % 2 == 0]
odd = [x for x in a if x % 2 != 0]
best = max(e * o for e in even for o in odd) # для больших n нужен более быстрый способ:
# max(even) * max(odd), если оба положительны, либо анализ знаков
Пример 3 (задание 24). Найти длину самой длинной серии одинаковых символов в строке.
with open('24.txt') as f:
s = f.read().strip()
maxlen = 1
cur = 1
for i in range(1, len(s)):
if s[i] == s[i-1]:
cur += 1
maxlen = max(maxlen, cur)
else:
cur = 1
print(maxlen)
Типичные ошибки
- Путают индексацию с 0 и с 1 — при описании условия в задаче (например, «чётные позиции») легко сбиться на off-by-one.
- Не учитывают граничные элементы — забывают проверить последний/первый элемент после цикла (особенно при подсчёте серии, максимум нужно обновить и после выхода из цикла).
- Используют квадратичный алгоритм там, где нужен линейный — при переборе всех пар чисел на больших файлах (–) программа не успевает выполниться за отведённое время; нужно искать способ обойтись одним проходом.
- Забывают про типы данных — при работе со строками путают
intиstr, при извлечении цифр из строки не переводят их в число. - Не учитывают знак чисел — в условиях на произведение/сумму максимум может достигаться на двух отрицательных числах, а не на двух положительных.
- Неверно читают файл — не убирают пробелы/переносы строк (
strip()), из-за чего в конец списка попадает пустая строка или лишний символ. - Смешивают подряд идущие и произвольные элементы — задача может требовать именно соседние элементы, а решение ищет любую пару в массиве.
Где встречается на экзамене
- Задание 17 — анализ числовой последовательности из файла: поиск пар/троек по условию, статистика (суммы, произведения, количество), часто с ограничением на «соседство» элементов.
- Задание 24 — анализ строки/текста из файла: подсчёт вхождений подстрок, поиск максимальных серий символов, замена по шаблону, обработка текста с учётом регистра или цифр.
- Обе задачи требуют написания короткой программы (Python, Паскаль, С++, Excel/VBA — любой язык) и относятся к практическому программированию, где важна как правильность алгоритма, так и его эффективность по времени.
Частые вопросы
Чем отличаются задания 17 и 24 по типу данных?
В 17 обрабатывается последовательность чисел из файла, в 24 — строка символов (текст). Алгоритмический подход похож: один проход по данным с накоплением результата.
Нужно ли учитывать индексацию с 1 при решении на Python?
В условии задачи элементы часто нумеруются с 1, а в Python индексы начинаются с 0. Переводите условие в индексы Python аккуратно, чтобы не сдвинуть позицию на единицу.
Как проверить, что моя программа не превысит лимит по времени?
Если в файле до миллиона чисел, избегайте вложенных циклов (O(n²)). Ищите способ решить задачу за один проход (O(n)) с использованием накопителей, множеств или предварительно вычисленных максимумов/минимумов.
Что делать, если в конце файла есть лишний пробел или пустая строка?
Используйте strip() перед разбиением строки, а при чтении чисел через split() пустые токены автоматически игнорируются.
Как искать максимальную серию одинаковых символов или чисел?
Заведите счётчик текущей серии, увеличивайте его, пока элемент совпадает с предыдущим, и сбрасывайте на 1 при несовпадении. После каждого шага сравнивайте с максимумом, не забывая проверить последний элемент после выхода из цикла.
Можно ли решать 17 и 24 не на Python?
Да, подходит любой язык программирования (Паскаль, С++, Java, VBA в Excel) — оценивается корректность алгоритма и результат, а не конкретный синтаксис.
Потренироваться: задание 17 · задание 24