Как выбрать символ при нескольких максимальных подряд идущих символах?
Что проверяют
Умеете ли вы заметить неоднозначность в условии и договориться о ней до кода. Найти самую длинную серию одинаковых символов несложно, а вопрос про ничью проверяет, спросите ли вы, какой символ считать правильным ответом. Следом обычно просят вернуть всех лидеров сразу или уложиться в один проход без лишней памяти.
Как отвечать
Сначала уточните правило выбора, вариантов несколько:
- первая серия по позиции: самый частый ожидаемый вариант, получается сам собой при строгом сравнении
>; - последняя серия: то же самое, но с
>=; - наименьший символ по алфавиту: сравнивайте пару
(длина, -ord(символ))или храните кандидатов; - все лидеры: собирайте список и сбрасывайте его, когда находится серия длиннее.
Решение за O(n) по времени и O(1) по памяти: идём по строке, держим длину текущей серии и лучшую пару «символ, длина». Серию обязательно закрывать и после цикла, иначе последняя группа не попадёт в сравнение. Короче всего через itertools.groupby:
from itertools import groupby
def longest_run_char(s: str) -> str:
best_char, best_len = "", 0
for ch, group in groupby(s):
n = sum(1 for _ in group)
if n > best_len:
best_char, best_len = ch, n
return best_charВстроенный max(..., key=...) при равных ключах возвращает первый найденный элемент, это поведение описано в документации, на него можно опереться. Проговорите краевые случаи: пустая строка, один символ, строка без повторов, где каждая серия длины 1 и по правилу «первая» ответом будет s[0].
Где спотыкаются
Забывают проверить последнюю серию после цикла. Строка "abccc" тогда возвращает a вместо c.
Путают серии с общим числом вхождений и берут collections.Counter. В строке "abababcc" чаще всех встречается a, а самая длинная серия у c.
Пустую строку обрабатывают обращением к s[-1] или s[0] и получают IndexError. Решите заранее, что вернуть: пустую строку, None или исключение, и скажите это вслух.