← Назад к вопросам

Разворот порядка слов в строке

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 стиль
  • Работает корректно на всех тестовых случаях
Разворот порядка слов в строке | PrepBro