Пройдите массив справа налево, компактно записывая ненулевые элементы к правому краю. Оставшийся префикс заполните нулями: порядок сохраняется, время O(n), дополнительная память O(1).
дан массив a = [1, 20, 10, 0, 59, 63, 0, 88, 0] -> [0, 0, 0, 1, 20, 10, 59, 63, 88]
Пройдите массив справа налево, компактно записывая ненулевые элементы к правому краю. Оставшийся префикс заполните нулями: порядок сохраняется, время O(n), дополнительная память O(1).
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
дан массив a = [1, 20, 10, 0, 59, 63, 0, 88, 0] -> [0, 0, 0, 1, 20, 10, 59, 63, 88]
нужно написать оптимальную функцию, которая переносит нули в начало массива и сохраняет порядок остальных элементов
def move_zeros_to_left(a: List[int]) -> List[int]: pass
Ответ
Пройдите массив справа налево, компактно записывая ненулевые элементы к правому краю. Оставшийся префикс заполните нулями: порядок сохраняется, время O(n), дополнительная память O(1).
Чтение справа предотвращает перезапись ещё не обработанных элементов. Функция меняет исходный список:
def move_zeros_to_left(a: list[int]) -> list[int]:
write = len(a) - 1
for read in range(len(a) - 1, -1, -1):
if a[read] != 0:
a[write] = a[read]
write -= 1
for i in range(write + 1):
a[i] = 0
return a
Для примера получается [0, 0, 0, 1, 20, 10, 59, 63, 88]. Пустой список и список только из нулей также обрабатываются.