Реверс списка без использования встроенных методов

Данная реализация корректна: два указателя меняют симметричные элементы местами. arr и res имеют одинаковый id, а два отдельных литерала списка через is дают False.

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

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

Данная реализация корректна: два указателя меняют симметричные элементы местами. arr и res имеют одинаковый id, а два отдельных литерала списка через is дают False.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо написать функцию, которая меняет порядок элементов списка на противоположный без применения метода .reverse() и без использования срезов типа [::-1]. При этом список должен быть изменён «на месте», а не создаваться новый объект.

def manual_reverse(seq: list) -> list:
    left, right = 0, len(seq) - 1
    while left < right:
        seq[left], seq[right] = seq[right], seq[left]
        left += 1
        right -= 1
    return seq

manual_reverse([1, 2, 3])

arr = [1, 2, 3]
res = manual_reverse(arr)
print(id(arr), id(res))
print([1, 2] is [1, 2])

Ответ

Данная реализация корректна: два указателя меняют симметричные элементы местами. arr и res имеют одинаковый id, а два отдельных литерала списка через is дают False.

left начинается с первого элемента, right — с последнего. После каждого обмена оба указателя движутся к центру, поэтому каждый элемент занимает зеркальную позицию. Для нечётной длины центральный элемент остаётся на месте.

arr = [1, 2, 3]
res = manual_reverse(arr)
assert arr == [3, 2, 1]
assert res is arr
assert ([1, 2] is [1, 2]) is False

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

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

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

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

Подробнее