Как перевернуть строку в 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) по стеку (риск переполнения).
Критерии приёмки
- Функция корректно переворачивает обычные ASCII-строки.
- Функция не аварийно завершается на длинных строках (для рекурсии — указанное ограничение).
- Тесты с Unicode-графемами либо проходят (при использовании библиотеки), либо явно помечаются как неподдерживаемые.
- Производительность соответствует ожиданиям: O(n) для большинства реализаций.
Набор тестов (примерные кейсы)
- Пустая строка: “” → “”
- Один символ: “a” → “a”
- Пробелы и пунктуация: “a b!” → “!b a”
- Длинная строка (10^5 символов) — проверка времени и памяти
- Unicode: “mañana” (с диакритикой), эмодзи “🙂😂” — ожидаемое поведение описать заранее
Роль‑ориентированные чеклисты
- Для интервьюируемого: выбрать один корректный метод, написать тесты и объяснить сложность.
- Для разработчика в продакшене: учитывать память, баги с Unicode, покрыть тестами пограничные случаи.
- Для новичка: начать с простого варианта (срез в Python, split/reverse/join в JS), затем изучить inplace-реверс.
Короткая методология выбора
- Определите требования: поддержка Unicode? Ограничения памяти?
- Если нужна простота — используйте встроенный метод.
- Если нужна производительность в памяти — используйте inplace-реверс.
- Для корректной обработки графем — используйте библиотеку, поддерживающую Unicode-графемы.
Дополнительно: альтернативные подходы и когда они уместны
- Потоковая обработка (streaming reverse) — редко применима, потому что для реверса строки нужно знать конец; полезно для разворачивания чанков в файловых потоках.
- Параллельные алгоритмы — возможны для очень длинных данных, но сложны в реализации и редко оправданы для строк.
Короткое резюме
- Существует много способов перевернуть строку; выбор зависит от простоты, производительности и требований к Unicode.
- Для большинства задач встроенных средств достаточно. Если работа с графемами важна — используйте специализированные библиотеки.
Краткое объявление: если вы готовите интервью по строковым задачам, потренируйтесь на нескольких реализациях и обязательно добавьте тесты на Unicode.
Похожие материалы
Как стать экспертом по SEO — практическое руководство
Как указать авторство на TikTok и зачем это нужно
Слои в Canva: руководство по позиционированию
Лучшие уроки по анимации в Blender
Whistle Phone на iPad — бесплатные звонки