Меняем местами симметричные элементы списка: первый с последним, второй с предпоследним и так до середины. Список изменяется на месте за O(n) времени и O(1) дополнительной памяти.
Задача. Дан список надо его развернуть
Меняем местами симметричные элементы списка: первый с последним, второй с предпоследним и так до середины. Список изменяется на месте за O(n) времени и O(1) дополнительной памяти.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Задача. Дан список надо его развернуть
#z = [1, 2, 3, 4, 5] # В итоге должен получиться список [5, 4, 3, 2, 1] #Необходимо реализовать функцию, которая развернет список.
Встроенные способы (z[::-1] z.reverse() reversed(z)) использовать нельзя.
#Новые списки создавать нельзя. Желательно использовать цикл for def reverse(lst: list) -> list: ...
Ответ
Меняем местами симметричные элементы списка: первый с последним, второй с предпоследним и так до середины. Список изменяется на месте за O(n) времени и O(1) дополнительной памяти.
Новый список не создаётся:
def reverse(lst: list) -> list:
for left in range(len(lst) // 2):
right = len(lst) - 1 - left
lst[left], lst[right] = lst[right], lst[left]
return lst
Для [1, 2, 3, 4, 5] получится [5, 4, 3, 2, 1]. У списка нечётной длины средний элемент остаётся на месте. Пустой список и список из одного элемента не требуют перестановок. Возвращается тот же объект, поэтому изменение будет видно через другие ссылки на него.