дан массив a = [1, 20, 10, 0, 59, 63, 0, 88, 0] -> [0, 0, 0, 1, 20, 10, 59, 63, 88]

Пройдите массив справа налево, компактно записывая ненулевые элементы к правому краю. Оставшийся префикс заполните нулями: порядок сохраняется, время O(n), дополнительная память O(1).

Короткий ответ

Что ответить на собеседовании

Пройдите массив справа налево, компактно записывая ненулевые элементы к правому краю. Оставшийся префикс заполните нулями: порядок сохраняется, время 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]. Пустой список и список только из нулей также обрабатываются.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее