Back to questions
СБЕР
Middle — Senior
13
Напиши функцию, которая возвращает символ с максимальным количеством подряд идущих повторений в строке?
Companies where asked
Answer from AI
sobes.tech AI
Что хотят услышать интервьюеры:
Нужно решить задачу за один проход по строке, без лишней памяти и без разбиения строки на подстроки. Важно корректно отслеживать текущую серию одинаковых символов и максимальную серию на протяжении обхода. Хорошо, если решение учитывает пустую строку и случай, когда максимальных серий несколько.
Определение:
Функция должна найти символ, который образует самую длинную непрерывную последовательность одинаковых символов в строке, и вернуть этот символ. Если таких последовательностей несколько, обычно возвращают первый найденный по ходу строки. Для эффективности задача решается за O(n) по времени и O(1) по памяти.
Пример использования:
def max_repeat_char(s: str):
if not s:
return None
max_char = s[0]
max_len = 1
curr_char = s[0]
curr_len = 1
for i in range(1, len(s)):
if s[i] == curr_char:
curr_len += 1
else:
if curr_len > max_len:
max_len = curr_len
max_char = curr_char
curr_char = s[i]
curr_len = 1
if curr_len > max_len:
max_char = curr_char
return max_char
print(max_repeat_char("aaabbccccdd")) # c
print(max_repeat_char("abbbcc")) # b
print(max_repeat_char("")) # None
Пояснение кода:
- Если строка пустая, возвращается
None, потому что нет символа, который можно было бы выбрать. - Инициализируются два набора переменных:
- текущая серия:
curr_char,curr_len - лучшая серия:
max_char,max_len
- текущая серия:
- Строка обходится слева направо.
- Если текущий символ совпадает с предыдущим в серии, длина текущей серии увеличивается.
- Если символ изменился, текущая серия сравнивается с максимальной, после чего серия начинается заново с нового символа.
- После цикла делается финальная проверка, потому что самая длинная серия может закончиться в конце строки.
Ключевые моменты:
- Решение должно быть линейным:
O(n). - Не нужно хранить все серии, достаточно двух счётчиков.
- Важно сделать финальную проверку после цикла.
- Для пустой строки стоит явно определить поведение:
None, исключение или другой договорённый результат. - Если нужна не только буква, но и длина серии, функцию легко расширить дополнительным возвращаемым значением.