Гид по технологиям

Как перевернуть строку в C++, Python и JavaScript

4 min read Программирование Обновлено 31 Dec 2025
Перевернуть строку в C++, Python и JavaScript
Перевернуть строку в C++, Python и JavaScript

Примеры переворота строки в C++, Python и JavaScript

Краткое содержание

  • Разные методы для C++, Python и JavaScript
  • Когда методы дают неожиданный результат (Unicode и комбинирующие символы)
  • Быстрая шпаргалка по выбору метода
  • Тесты и критерии приёмки

Разные методы для переворота строки в C++

Вы можете перевернуть строку в C++ несколькими способами: используя std::reverse, меняя символы местами, используя реверс-итераторы или временную строку.

Использование встроенной функции reverse()

Ниже — пример на C++ с использованием std::reverse():

// Реализация на C++ для переворота строки
// с использованием встроенной функции reverse()
#include 
using namespace std;

int main()
{
    string str1 = "MUO";
    string str2 = "Welcome to MUO";
    string str3 = "She sells seashells by the seashore";

    cout << "Input string:" << endl;
    cout << str1 << endl;
    cout << str2 << endl;
    cout << str3 << endl;

    reverse(str1.begin(), str1.end());
    reverse(str2.begin(), str2.end());
    reverse(str3.begin(), str3.end());

    cout << "Reversed string: " << endl;
    cout << str1 << endl;
    cout << str2 << endl;
    cout << str3 << endl;

    return 0;
}

Выход программы (пример):

Input string:
MUO
Welcome to MUO
She sells seashells by the seashore
Reversed string:
OUM
OUM ot emocleW
erohsaes eht yb sllehsaes slles ehS

Переворот строки путём обмена символов

Реализовать реверс вручную можно с помощью обмена пары символов с двух концов строки:

// Переворот строки в C++ через обмен символов
#include 
using namespace std;

void reverseString(string& str)
{
    int size = str.size();
    for (int i = 0, j = size - 1; i < size / 2; ++i, --j)
    {
        swap(str[i], str[j]);
    }
}

int main()
{
    string str1 = "MUO";
    string str2 = "Welcome to MUO";
    string str3 = "She sells seashells by the seashore";

    cout << "Input string:" << endl;
    cout << str1 << endl;
    cout << str2 << endl;
    cout << str3 << endl;

    reverseString(str1);
    reverseString(str2);
    reverseString(str3);

    cout << "Reversed string: " << endl;
    cout << str1 << endl;
    cout << str2 << endl;
    cout << str3 << endl;

    return 0;
}

Использование реверс-итераторов и конструктора

Быстрый и выразительный способ — конструктор string с реверс-итераторами:

// Переворот строки с помощью реверс-итераторов
#include 
using namespace std;

int main()
{
    string str1 = "MUO";
    string str2 = "Welcome to MUO";
    string str3 = "She sells seashells by the seashore";

    cout << "Input string:" << endl;
    cout << str1 << endl;
    cout << str2 << endl;
    cout << str3 << endl;

    string reversedStr1 = string(str1.rbegin(), str1.rend());
    string reversedStr2 = string(str2.rbegin(), str2.rend());
    string reversedStr3 = string(str3.rbegin(), str3.rend());

    cout << "Reversed string: " << endl;
    cout << reversedStr1 << endl;
    cout << reversedStr2 << endl;
    cout << reversedStr3 << endl;

    return 0;
}

Переворот через временную строку

Ещё один простой подход — сформировать новую строку, добавляя символы с конца исходной:

// Переворот строки с помощью временной строки
#include 
using namespace std;

string reverseString(string str)
{
    int size = str.size();
    string tempStr;
    for (int i = size - 1; i >= 0; --i)
    {
        tempStr.push_back(str[i]);
    }
    return tempStr;
}

int main()
{
    string str1 = "MUO";
    string str2 = "Welcome to MUO";
    string str3 = "She sells seashells by the seashore";

    cout << "Input string:" << endl;
    cout << str1 << endl;
    cout << str2 << endl;
    cout << str3 << endl;

    str1 = reverseString(str1);
    str2 = reverseString(str2);
    str3 = reverseString(str3);

    cout << "Reversed string: " << endl;
    cout << str1 << endl;
    cout << str2 << endl;
    cout << str3 << endl;

    return 0;
}

Разные методы для переворота строки в Python

Python предоставляет лаконичные средства: срезы, reversed(), рекурсию и временную строку.

Использование расширенного среза

# Python: переворот строки с помощью расширенного среза
def reverseString(s):
    return s[::-1]

str1 = "MUO"
str2 = "Welcome to MUO"
str3 = "She sells seashells by the seashore"

print("Input string:")
print(str1)
print(str2)
print(str3)

str1 = reverseString(str1)
str2 = reverseString(str2)
str3 = reverseString(str3)

print("Reversed string:")
print(str1)
print(str2)
print(str3)

Рекурсивный подход

# Python: переворот строки рекурсией
def reverseString(s):
    if len(s) == 0:
        return s
    else:
        return reverseString(s[1:]) + s[0]

Рекурсия работает, но при очень длинных строках может вызвать переполнение стека.

Использование reversed()

# Python: переворот строки с помощью встроенной функции reversed()
def reverseString(s):
    return "".join(reversed(s))

Переворот через временную строку

# Python: переворот через временную строку
def reverseString(s):
    temp = ""
    for ch in s:
        temp = ch + temp
    return temp

Разные методы для переворота строки в JavaScript

JavaScript — гибкий язык: простейший вариант — split/reverse/join, также можно рекурсивно или вручную собирать временную строку.

Рекурсия в JavaScript

// JavaScript: переворот строки рекурсивно
function reverseString(str) {
  if (str === "") {
    return "";
  } else {
    return reverseString(str.substr(1)) + str.charAt(0);
  }
}

Встроенные методы (split/reverse/join)

// JavaScript: split + reverse + join
function reverseString(str) {
  return str.split("").reverse().join("");
}

Временная строка в JavaScript

// JavaScript: переворот через временную строку
function reverseString(str) {
  var size = str.length;
  var tempStr = "";
  for (let i = size - 1; i >= 0; i--) {
    tempStr += str[i];
  }
  return tempStr;
}

Когда методы дают неожиданный результат (особенно важно)

Important: простые методы, которые работают на уровне кодовых единиц (code units), могут ломать символы Unicode:

  • Эмодзи и некоторые символы вне BMP кодируются в UTF-16 суррогатными парами. Разворот по code unit нарушит порядок и сделает символ некорректным.
  • Комбинирующие символы (accent marks) и диакритика визуально связаны с базовым символом. Разворот по юникод-строкам может отделить комбинации.

Когда нужен корректный результат для Unicode, используйте библиотеки, которые работают с графемными кластерами (grapheme clusters) или оперируют последовательностями кодовых точек (code points), например ICU, библиотеку grapheme в Python, или Intl.Segmenter в современных браузерах.

Быстрая шпаргалка по выбору метода

  • Если нужна простота и корректность для ASCII/латиницы: используйте встроенные методы (std::reverse, s[::-1], split+reverse+join).
  • Если важна производительность и низкое потребление памяти: делайте inplace-реверс (обмен пар символов).
  • Если нужна поддержка Unicode-графем: используйте специализированные библиотеки.

Факты: сложность и память

  • Встроенные реверсы (std::reverse, slice[::-1], reverse()): O(n) по времени, O(1) дополнительной памяти при inplace; в Python и JS методы, создающие новую строку, требуют O(n) дополнительной памяти.
  • Рекурсивный вариант: O(n) по времени, O(n) по стеку (риск переполнения).

Критерии приёмки

  1. Функция корректно переворачивает обычные ASCII-строки.
  2. Функция не аварийно завершается на длинных строках (для рекурсии — указанное ограничение).
  3. Тесты с Unicode-графемами либо проходят (при использовании библиотеки), либо явно помечаются как неподдерживаемые.
  4. Производительность соответствует ожиданиям: O(n) для большинства реализаций.

Набор тестов (примерные кейсы)

  • Пустая строка: “” → “”
  • Один символ: “a” → “a”
  • Пробелы и пунктуация: “a b!” → “!b a”
  • Длинная строка (10^5 символов) — проверка времени и памяти
  • Unicode: “mañana” (с диакритикой), эмодзи “🙂😂” — ожидаемое поведение описать заранее

Роль‑ориентированные чеклисты

  • Для интервьюируемого: выбрать один корректный метод, написать тесты и объяснить сложность.
  • Для разработчика в продакшене: учитывать память, баги с Unicode, покрыть тестами пограничные случаи.
  • Для новичка: начать с простого варианта (срез в Python, split/reverse/join в JS), затем изучить inplace-реверс.

Короткая методология выбора

  1. Определите требования: поддержка Unicode? Ограничения памяти?
  2. Если нужна простота — используйте встроенный метод.
  3. Если нужна производительность в памяти — используйте inplace-реверс.
  4. Для корректной обработки графем — используйте библиотеку, поддерживающую Unicode-графемы.

Дополнительно: альтернативные подходы и когда они уместны

  • Потоковая обработка (streaming reverse) — редко применима, потому что для реверса строки нужно знать конец; полезно для разворачивания чанков в файловых потоках.
  • Параллельные алгоритмы — возможны для очень длинных данных, но сложны в реализации и редко оправданы для строк.

Короткое резюме

  • Существует много способов перевернуть строку; выбор зависит от простоты, производительности и требований к Unicode.
  • Для большинства задач встроенных средств достаточно. Если работа с графемами важна — используйте специализированные библиотеки.

Краткое объявление: если вы готовите интервью по строковым задачам, потренируйтесь на нескольких реализациях и обязательно добавьте тесты на Unicode.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как стать экспертом по SEO — практическое руководство
Маркетинг

Как стать экспертом по SEO — практическое руководство

Как указать авторство на TikTok и зачем это нужно
Социальные сети

Как указать авторство на TikTok и зачем это нужно

Слои в Canva: руководство по позиционированию
Дизайн

Слои в Canva: руководство по позиционированию

Лучшие уроки по анимации в Blender
3D анимация

Лучшие уроки по анимации в Blender

Whistle Phone на iPad — бесплатные звонки
VoIP

Whistle Phone на iPad — бесплатные звонки

Создать электронную книгу в Pages на Mac
Электронные книги

Создать электронную книгу в Pages на Mac