← Все вопросы

Как развернуть массив на месте, не создавая новый список?

Задан 19 месяцев назад501 просмотров3 ответа
12

Знаю про a[::-1] и reversed(), но они создают новую последовательность. Хочу развернуть именно сам список in-place, без лишней памяти — как в задачах на собеседовании. Как это делается?

3 ответа

22
✓ Принятый ответ — помог автору

Метод двух указателей: один с начала, другой с конца, меняем элементы местами и сходимся к центру. O(n) времени, O(1) дополнительной памяти.

def reverse_in_place(a):
    i, j = 0, len(a) - 1
    while i < j:
        a[i], a[j] = a[j], a[i]
        i += 1
        j -= 1

x = [1, 2, 3, 4, 5]
reverse_in_place(x)
print(x)  # [5, 4, 3, 2, 1]

Именно такой код от тебя и хотят на собесе, когда говорят «разверни без срезов». А в обычном коде, конечно, проще a.reverse() — он тоже работает на месте.

Иван Белов Кстати, встроенный list.reverse() как раз делает это in-place и за O(n). · 19 месяцев назад
10

a.reverse() — разворачивает сам список без копии. Если просят руками — два указателя навстречу.

5

a.reverse().

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект