Sobes.tech
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

Пояснение кода:

  1. Если строка пустая, возвращается None, потому что нет символа, который можно было бы выбрать.
  2. Инициализируются два набора переменных:
    • текущая серия: curr_char, curr_len
    • лучшая серия: max_char, max_len
  3. Строка обходится слева направо.
  4. Если текущий символ совпадает с предыдущим в серии, длина текущей серии увеличивается.
  5. Если символ изменился, текущая серия сравнивается с максимальной, после чего серия начинается заново с нового символа.
  6. После цикла делается финальная проверка, потому что самая длинная серия может закончиться в конце строки.

Ключевые моменты:

  • Решение должно быть линейным: O(n).
  • Не нужно хранить все серии, достаточно двух счётчиков.
  • Важно сделать финальную проверку после цикла.
  • Для пустой строки стоит явно определить поведение: None, исключение или другой договорённый результат.
  • Если нужна не только буква, но и длина серии, функцию легко расширить дополнительным возвращаемым значением.