Разворот массива
Условие
Напишите метод, который принимает массив целых чисел и возвращает его в обратном порядке (первый элемент заменяет последний и так далее).
Пример
Вход: [1, 2, 3, 4, 5] Выход: [5, 4, 3, 2, 1]
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение: Разворот массива
Описание задачи
Требуется реализовать метод, который принимает массив целых чисел и возвращает его в полностью обратном порядке. Первый элемент становится последним, второй — предпоследним, и так далее. Данная операция часто называется разворотом массива (array reversal) и является фундаментальным алгоритмом в программировании.
Решение на Python
def reverse_array(arr):
"""
Разворачивает массив целых чисел в обратном порядке.
Args:
arr: список целых чисел
Returns:
список целых чисел в обратном порядке
"""
return arr[::-1]
Альтернативные подходы
1. Встроенный метод reverse()
def reverse_array(arr):
# Изменяет массив на месте и возвращает None,
# поэтому нужно вернуть копию
arr_copy = arr.copy()
arr_copy.reverse()
return arr_copy
2. Использование двух указателей
def reverse_array(arr):
"""
Разворот с использованием двух указателей (левый и правый).
Временная сложность O(n), пространственная O(n).
"""
left, right = 0, len(arr) - 1
result = arr.copy()
while left < right:
result[left], result[right] = result[right], result[left]
left += 1
right -= 1
return result
3. Рекурсивный подход
def reverse_array(arr, start=0, end=None):
"""
Рекурсивный разворот массива.
"""
if end is None:
end = len(arr) - 1
if start >= end:
return arr
arr[start], arr[end] = arr[end], arr[start]
return reverse_array(arr, start + 1, end - 1)
Тестовые примеры
import unittest
class TestReverseArray(unittest.TestCase):
def test_basic_reverse(self):
# Базовый случай из условия
assert reverse_array([1, 2, 3, 4, 5]) == [5, 4, 3, 2, 1]
def test_single_element(self):
# Массив с одним элементом
assert reverse_array([42]) == [42]
def test_two_elements(self):
# Массив с двумя элементами
assert reverse_array([1, 2]) == [2, 1]
def test_empty_array(self):
# Пустой массив
assert reverse_array([]) == []
def test_negative_numbers(self):
# Массив с отрицательными числами
assert reverse_array([-1, -2, -3, 0]) == [0, -3, -2, -1]
def test_duplicates(self):
# Массив с дубликатами
assert reverse_array([1, 1, 2, 2, 3]) == [3, 2, 2, 1, 1]
if __name__ == __main__:
unittest.main()
Анализ сложности
| Подход | Временная сложность | Пространственная сложность |
|---|---|---|
| Слайсинг [::-1] | O(n) | O(n) |
| Метод reverse() | O(n) | O(n) |
| Два указателя | O(n) | O(n) |
| Рекурсия | O(n) | O(n) стек вызовов |
Рекомендация
Для практического использования в тестировании и в большинстве случаев рекомендуется использовать слайсинг [::-1], так как это:
- Самое краткое и читаемое решение
- Идиоматичное для Python
- Производительное благодаря оптимизациям интерпретатора
- Безопасное — не изменяет исходный массив
Решение с двумя указателями полезно понимать для интервью, так как демонстрирует понимание алгоритмических паттернов и может быть перенесено на другие языки программирования, где слайсинг недоступен.