Напиши функцию для сжатия строки по заданному правилу в Python
Что проверяют
Аккуратность на краях и умение довести простой алгоритм до конца. Само кодирование серий пишется за пять минут, интервьюер смотрит на пустую строку, на последнюю группу и на то, вернёте ли вы оригинал, когда сжатие вышло длиннее исходника.
Как отвечать
Уточните правило: обычно просят заменить серию одинаковых символов на символ и число, а если результат не короче входа, вернуть вход как есть.
from itertools import groupby
def compress(s: str) -> str:
if not s:
return s
packed = "".join(f"{ch}{sum(1 for _ in g)}" for ch, g in groupby(s))
return packed if len(packed) < len(s) else sgroupby бьёт строку ровно на серии подряд идущих символов, поэтому последняя группа не требует отдельной обработки после цикла. Ручной вариант со счётчиком принимается так же охотно, но тогда не забудьте дописать хвост после выхода из цикла. Собирайте результат через список и join, а не через packed += ...: конкатенация строк в цикле даёт квадратичное время на длинных входах. Сложность решения линейная и по времени, и по памяти.
Где спотыкаются
Падают на пустой строке. Обращение к s[-1] ради дописывания хвоста даёт IndexError, и это самый частый провал в задаче: проверку if not s ставят в конец или не ставят вовсе.
Второе: забывают сравнить длины и возвращают a1b1c1 вместо abc. Условие про результат не длиннее оригинала звучит почти всегда, его просто пропускают мимо ушей.
Третье: не замечают неоднозначности формата. Если во входе есть цифры, строка a12 обратно разбирается двумя способами, и на вопрос про декомпрессию кандидат зависает. Про это стоит сказать самому, даже если обратное преобразование не просили.