Просматривайте символы слева направо, считая длину текущей серии. При смене символа добавляйте предыдущий символ и счётчик; после цикла обязательно сохраните последнюю серию.
Реализуйте RLE-сжатие строки: дан массив символов английского алфавита, нужно сжать его так, чтобы повторяющийся символ записывался один раз, а за ним — количество повторений. Например: AAAABBBAAA → A4B3A3.
Просматривайте символы слева направо, считая длину текущей серии. При смене символа добавляйте предыдущий символ и счётчик; после цикла обязательно сохраните последнюю серию.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Просматривайте символы слева направо, считая длину текущей серии. При смене символа добавляйте предыдущий символ и счётчик; после цикла обязательно сохраните последнюю серию.
Решение для строки или списка символов:
def rle(chars):
if not chars:
return ""
out = []
current = chars[0]
count = 1
for char in chars[1:]:
if char == current:
count += 1
else:
out.extend([current, str(count)])
current, count = char, 1
out.extend([current, str(count)])
return "".join(out)
AAAABBBAAA даёт A4B3A3. Время O(n), память результата O(n); здесь срез также занимает дополнительную память. Это не вариант in-place.