← Назад к вопросам
Разворот порядка слов в строке
1.0 Junior🔥 251 комментариев
#Python Core
Условие
Напишите функцию, которая меняет порядок слов в строке на обратный. Между словами должен быть ровно один пробел, без пробелов в начале и конце.
Пример
reverse_words("hello world") → "world hello" reverse_words(" the sky is blue ") → "blue is sky the"
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разворот порядка слов в строке
Задача: Развернуть порядок слов в строке, убедившись что между словами ровно один пробел, без пробелов в начале и конце.
Решение 1: Через split() и join() (рекомендуется)
Самое простое и читаемое решение:
def reverse_words(s):
"""
Разворачивает порядок слов в строке.
Алгоритм:
1. split() без аргументов разбивает по любым пробелам и удаляет пустые строки
2. [::-1] разворачивает список слов
3. join(' ') соединяет слова одиночным пробелом
"""
return " ".join(s.split()[::-1])
# Примеры
print(reverse_words("hello world")) # world hello
print(reverse_words(" the sky is blue ")) # blue is sky the
print(reverse_words("Python")) # Python
print(reverse_words("")) # ""
print(reverse_words(" multiple spaces ")) # spaces multiple
Почему это работает:
s.split()без аргументов разбивает по любому whitespace (пробелы, табуляция, перевод строки)- Автоматически удаляет ведущие/завершающие пробелы
- Удаляет пустые строки при наличии множественных пробелов
[::-1]разворачивает список" ".join()соединяет с одиночным пробелом между словами
Сложность:
- Время: O(n) где n — длина строки
- Память: O(n) для списка слов
Решение 2: Явный проход в обратном порядке
def reverse_words_explicit(s):
"""
Явный проход с обработкой пробелов.
"""
words = s.split() # Получаем список слов без пробелов
result = ""
for i in range(len(words) - 1, -1, -1):
result += words[i]
if i > 0: # Не добавляем пробел после последнего слова
result += " "
return result
print(reverse_words_explicit("hello world")) # world hello
print(reverse_words_explicit(" the sky is blue ")) # blue is sky the
Решение 3: Со списком (оптимизированно)
def reverse_words_list(s):
"""
Оптимизированная версия со списком.
Избегаем многократной конкатенации строк.
"""
words = s.split()
result = []
for i in range(len(words) - 1, -1, -1):
result.append(words[i])
return " ".join(result)
print(reverse_words_list("hello world")) # world hello
print(reverse_words_list(" the sky is blue ")) # blue is sky the
Решение 4: С использованием reversed()
def reverse_words_reversed(s):
"""
Использует встроенную функцию reversed().
"""
return " ".join(reversed(s.split()))
print(reverse_words_reversed("hello world")) # world hello
print(reverse_words_reversed(" the sky is blue ")) # blue is sky the
Примечание: reversed() работает с итератором, более эффективно по памяти
Решение 5: List comprehension
def reverse_words_comprehension(s):
"""
Компактный вариант с list comprehension.
"""
words = s.split()
return " ".join([words[i] for i in range(len(words) - 1, -1, -1)])
print(reverse_words_comprehension("hello world")) # world hello
print(reverse_words_comprehension(" the sky is blue ")) # blue is sky the
Решение 6: Через pop() (деструктивный способ)
def reverse_words_pop(s):
"""
Использует pop() для удаления последних элементов.
"""
words = s.split()
result = []
while words:
result.append(words.pop())
return " ".join(result)
print(reverse_words_pop("hello world")) # world hello
print(reverse_words_pop(" the sky is blue ")) # blue is sky the
# Минус: модифицирует исходный список
Решение 7: В два этапа (временная переменная)
def reverse_words_two_pass(s):
"""
В два прохода: сначала очищаем, потом разворачиваем.
"""
# Первый проход: очистка от лишних пробелов
words = s.split()
# Второй проход: разворот
words.reverse()
return " ".join(words)
print(reverse_words_two_pass("hello world")) # world hello
print(reverse_words_two_pass(" the sky is blue ")) # blue is sky the
Сравнение производительности
import time
def benchmark(func, s, iterations=100000):
start = time.time()
for _ in range(iterations):
func(s)
return time.time() - start
s = " the quick brown fox jumps over the lazy dog "
print(f"split()[::-1] + join(): {benchmark(reverse_words, s):.4f}s")
print(f"reversed() + join(): {benchmark(reverse_words_reversed, s):.4f}s")
print(f"Явный проход: {benchmark(reverse_words_explicit, s):.4f}s")
print(f"List comprehension: {benchmark(reverse_words_comprehension, s):.4f}s")
print(f"reverse() + join(): {benchmark(reverse_words_two_pass, s):.4f}s")
print(f"pop(): {benchmark(reverse_words_pop, s):.4f}s")
# Результат обычно:
# split()[::-1] + join(): 0.0045s ← Быстрое
# reversed() + join(): 0.0050s ← Чуть медленнее
# List comprehension: 0.0070s
# Явный проход: 0.0090s
# reverse() + join(): 0.0095s
# pop(): 0.0100s
Граничные случаи
# Пустая строка
print(reverse_words("")) # ""
# Одно слово
print(reverse_words("hello")) # hello
# Только пробелы
print(reverse_words(" ")) # ""
# Ведущие и завершающие пробелы
print(reverse_words(" hello ")) # hello
print(reverse_words(" hello world ")) # world hello
# Множественные пробелы между словами
print(reverse_words("a b c")) # c b a
# Смешанные пробельные символы
print(reverse_words("hello\tworld\nnew")) # new world hello
# Очень длинная строка
long_string = " ".join(["word"] * 1000)
result = reverse_words(long_string)
print(f"Длина результата: {len(result.split())}") # 1000
Практические примеры
# Форматирование полного имени
def reverse_name_order(full_name):
"""Меняет порядок компонентов имени."""
return reverse_words(full_name)
print(reverse_name_order("John Doe Smith")) # Smith Doe John
# Обработка текста
def reverse_sentence(sentence):
"""Разворачивает порядок слов в предложении."""
return reverse_words(sentence)
print(reverse_sentence("The quick brown fox jumps")) # jumps fox brown quick The
# Парсинг пути к файлу (условно)
def reverse_path_segments(path):
"""Разворачивает сегменты пути."""
return reverse_words(path.replace("/", " ")).replace(" ", "/")
print(reverse_path_segments("home / user / documents / file.txt"))
# Будет выглядеть развёрнутым
Полное решение с документацией
def reverse_words(s: str) -> str:
"""
Разворачивает порядок слов в строке.
Между словами будет ровно один пробел.
Ведущие и завершающие пробелы удаляются.
Args:
s (str): Исходная строка
Returns:
str: Строка со словами в обратном порядке
Time Complexity: O(n) где n — длина строки
Space Complexity: O(n) для списка слов
Examples:
>>> reverse_words("hello world")
'world hello'
>>> reverse_words(" the sky is blue ")
'blue is sky the'
>>> reverse_words("Python")
'Python'
>>> reverse_words("")
''
"""
return " ".join(s.split()[::-1])
# Тесты
if __name__ == "__main__":
test_cases = [
("hello world", "world hello"),
(" the sky is blue ", "blue is sky the"),
("Python", "Python"),
("", ""),
(" hello ", "hello"),
("a b c d e", "e d c b a"),
("\t\tspaces\t\t", "spaces"),
]
for s, expected in test_cases:
result = reverse_words(s)
status = "✓" if result == expected else "✗"
print(f"{status} reverse_words({s!r}) = {result!r}")
Рекомендация
Используй простейший вариант:
def reverse_words(s):
return " ".join(s.split()[::-1])
Почему:
- Самый читаемый — ясно видна логика
- Самый короткий — одна строка кода
- Производительный — O(n) время и память
- Стандартный Python стиль
- Обрабатывает все граничные случаи автоматически
Это идеальное решение для интервью:
- Демонстрирует знание встроенных методов
- Показывает понимание срезов (
[::-1]) - Использует элегантный и Pythonic стиль
- Работает корректно на всех тестовых случаях