Я отправил инструмент обратки String на Toolz.dev, думая, что это самая скучная вещь, которую я строил весь месяц. split('').reverse().join(''). Что могло пойти не так. Затем я вставил образец текста I'd написанный - который, поскольку я чувствовал себя мило, закончился на "Юникод: ラ い 🌍" - и результат вернулся, когда два смайлика превратились в искаженные коробки. 🌍🚀 становящийся \ude80🜍\ud83c, йо- Китайские иероглифы полностью перевернулись. Эмоджи разрушился.
Этот пятиминутный сюрприз на самом деле является самым полезным, что я могу научить вас о реверсировании строк, поэтому все это руководство построено вокруг него. реверсирование текста звучит тривиально, и для простого ASCII это так. В тот момент, когда вы вводите эмодзи, флаги или определенные символы с акцентом, " переверните строку & quot; перестает иметь один очевидный ответ - и большинство инструментов, включая этот, тихо выбирают ответ, который их нарушает.
выше струна реверс Инструмент делает одну вещь: он мгновенно меняет символы, когда вы печатаете. Нет режимов для настройки, нет регистрации, и ваш текст никогда не покидает браузер. Позвольте мне показать вам, что именно он делает, где он ломается и как изменить текст правильно В реальном коде, когда поломка неприемлема.
TL;DR: Вставьте текст в струна реверс и он меняет порядок персонажей в прямом эфире -
HelloстановитьсяolleH, йо- Это режим смены одного символа (без отдельных режимов слова или строки), он автоматически обновляется по мере ввода, и вы можете копировать или загрузить результат. Это идеально подходит для проверок палиндрома, быстрых головоломок и проверки ответов на собеседование. Хедз-ап: как простой JavaScriptsplit(''), он ломает эмодзи и флаги, потому что он делится по коду кода. обычный текст и CJK в порядке обратного . Соедините его с конвертер или счетчик слов для быстрой работы с текстом.
Что на самом деле делает инструмент обратного струна?
Ровно одна операция: она меняет порядок символов. Последний персонаж становится первым и так далее.
Вход: Hello World
Выход: dlroW olleH
Под капотом логика действительно одна строка - та же строка, которую вы 'd пишете в интервью JavaScript:
text.split('').reverse().join('')
Нет «обратных слов» или «обратных строк», прячющихся в меню. Ранее на этой странице описаны характеры, слова, предложения и линейные режимы, которые были жизнерадостными, а не реальными. Инструмент переворачивает символы, полный останов. Он обновляется автоматически по мере ввода, поэтому вы видите обратный результат в реальном времени, и он дает вам количество символов и строк как для ввода, так и для вывода. Вы можете вставить текст, загрузить текстовый файл, загрузить с URL-адреса, затем скопировать результат или загрузить его в виде .txt, йо-
Если вы конкретно хотите изменить порядок слов (Hello World → World Hello), вы делаете это в коде с split(' ').reverse().join(' ')- I' покажет фрагменты ниже.
Почему смайлики ломаются, когда вы их переворачиваете?
Это часть, которую стоит понять, потому что она объясняет целый класс ошибок.
Строки JavaScript — это последовательности UTF-16 Кодовые единицы, а не & quot;characters& quot; в человеческом смысле. большинство повседневных символов - английские буквы, цифры, знаки препинания и даже китайские, японские и корейские символы - помещаются в единую 16-битную единицу кода. так split('') Разрезы между ними чисто и обратные работы:
'你好世界'.split('').reverse().join('') // → '界世好你' ✅
Но смайлики, последовательности флагов и некоторые символы в прямом эфире наружу этот диапазон и хранятся как суррогатные пары- две единицы кода, которые вместе что-то означают. split('') Счастливо разрезает их пополам, а перетасовка половинок в ерунду:
'AB🌍🚀'.split('').reverse().join('') // → mojibake, the emoji shatter ❌
Объединение меток — это другая ловушка. Акцентированная буква может храниться двумя способами: как одна предварительно составленная кодовая точка (é), или как базовую букву плюс отдельный комбинированный акцент (e + ◌́). Предварительная версия переворачивается в порядке. Разложившаяся версия отсоединяет акцент, который отплывает и приземляется не на ту букву после разворота.
Итак, честное правило для этого инструмента: Обычный текст, цифры, пунктуация и CJK реверсируются правильно, смайлики, эмодзи и разложенные акценты сломаются. Это's не является дефектом, уникальным для Toolz.dev - it's что split('') Делает везде, и много "реверсивных" сайтов ведут себя одинаково. Я преднамеренно оставил наивную версию на месте, потому что она быстра, прозрачна и соответствует тому, что имеет в виду большинство людей, когда они говорят: «Отменяем это», но вы заслуживаете того, чтобы знать преимущество.
Как правильно перевернуть строку в коде?
Если вы пишете настоящий код и юникод, вот 39; вот лестница от наивной до исправления.
Уровень 1 - наивный (что делает инструмент): ломает эмодзи.
str.split('').reverse().join('')
Уровень 2 - оператор распространения: Итерирует по коду ставить, поэтому он сохраняет большинство смайликов в целости (суррогатные пары остаются вместе). Все еще ломает разложившиеся метки и множественные последовательности, такие как флаги.
[...str].reverse().join('')
Уровень 3 - с учетом графем: Относитесь к каждому «восприятию пользователя» как атомарному. Это действительно правильный подход.
const seg = new Intl.Segmenter('en', { granularity: 'grapheme' });
[...seg.segment(str)].map(s => s.segment).reverse().join('');
Intl.Segmenter Обрабатывает эмодзи, флаги, модификаторы тона кожи и правильно сочетает метки. Это версия, которую я отправлю в производство, если реверсивный текст пользователя с помощью смайликов был реальным требованием.
Вот одна и та же операция на разных языках, для практики и справки:
# Python — [::-1] works by code point, similar to JS spread
reversed_str = original[::-1]
words_reversed = ' '.join(original.split()[::-1])
// Java — StringBuilder.reverse() is code-unit based (same emoji caveat)
String reversed = new StringBuilder(original).reverse().toString();
// Go — []rune iterates by code point, safer than byte reversal
runes := []rune(original)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
reversed := string(runes)
// PHP — strrev() is byte-based and mangles any multi-byte UTF-8
$reversed = strrev($original); // breaks UTF-8
Обратите внимание на шаблон: почти каждый язык "Очевидный"Обратный код на основе кодового или байтового и имеет одинаковую слабость Unicode. Достижение опции Grapheme-Aware — это исключение, а не по умолчанию.
Для чего на самом деле подходит разворот строк?
Помимо канонического разминки интервью, он зарабатывает себе на жизнь в нескольких местах.
Паиндромные проверки. Обратите строку и сравните с оригиналом - если они совпадают, это 's палиндром. Попробуйте racecar, level, или 12321 В инструменте и смотри выводы возвращаются идентичные. Для фраз-палиндромы, как «Мужчина план, планируют канал Панамы», — сначала раздевайте пробелы и корпус.
Проверка собственного кода. Когда вы шлифуете проблемы с инверсией в стиле leetcode, вставьте ожидаемый результат в инструмент для проверки здравомыслия за секунду. Это быстрый оракул для случая смены персонажа.
Быстрые головоломки и игривый текст. Обратные сообщения, словесные игры, зеркальные социальные посты - низкие ставки, и разворот - это свой собственный обратный ход, поэтому двойной разворот возвращает вам исходный назад. Это свойство удобно для тестирования: обратный ход, снова обратный ход, подтвердите вас и #39; дома.
Одно дело не используйте его для: безопасности. реверсирование - это трюк для вечеринок, а не шифрование - it's тривиально отменено. Оно появляется в "obfuscation" обучающих материалах, но никогда не обрабатывает перевернутый текст как защищенный.
| Тип разворота | пример | в инструменте? | фрагмент кода |
|---|---|---|---|
| символы | abc → cba |
Да (единственный режим) | [...s].reverse().join('') |
| честный | a b c → c b a |
Нет - сделайте это в коде | s.split(' ').reverse().join(' ') |
| орнамент | Линия заказ перевернут | Нет - сделайте это в коде | s.split('\n').reverse().join('\n') |
| безопасный для графема | Эмодзи остаться нетронутым | Нет - нужен Intl.Segmenter | См. уровень 3 выше |
Двухочковый подход, если вы готовитесь к собеседованию
Причина, по которой интервьюеры любят этот вопрос, заключается в том, что элегантный ответ вообще не использует встроенный реверс. Вы идете по двум указателям друг к другу и меняйте:
Original: H E L L O
i j swap H and O
O E L L H
i j swap E and L
O L L E H
ij pointers meet — done
Он работает за время O (n) и, сделанный на месте на изменяемом массиве, O (1) дополнительное пространство.В JavaScript строки неизменяемы, поэтому вы можете 't буквально поменять местами, но двухуказательная логика - это то, что они 're проверяете, что вы понимаете. рекурсивная версия - reverse(s) = last char + reverse(rest)- красивее, но использует пространство стека вызовов O (n), что является компромиссом, о котором стоит упомянуть вслух в интервью.
И помните, что свойство делает тестирование тривиальным: разворот — это его обратный. Дважды поменяйте строку, и вы вернулись туда, где начали. Когда я юнит-тестирую любой код разворота, это утверждение номер один: reverse(reverse(x)) === x для партии входных данных, включая, особенно, смайлики, тест фактически выявляет ошибку суррогатной пары, а не скрывает ее.
Часто задаваемые вопросы
Поддерживает ли инструмент обратного хода строки смену слова или строки?
нет , йо- Он имеет один режим, который меняет символы. Нет отдельного режима слов или линейного порядка. Если вам нужно изменить порядок слов или строк, сделайте это в коде с помощью split(' ') или split('\n') затем .reverse().join(...), йо-
Почему смайлики выходят искаженными после разворота?
Потому что инструмент меняется на кодовый блок UTF-16, например, JavaScript. split(''). Эмодзи и последовательности флагов хранятся как суррогатные пары - две кодовые единицы, которые имеют смысл только вместе - и обратное разделение их на части. Обычный текст и символы CJK представляют собой единичные кодовые единицы, поэтому они правильно меняются местами.
Обрабатывает ли он юникод и текст CJK?
частично. Китайский, японский, корейский, кириллический и предварительно составленные символы с акцентом на реверс корректно переворачиваются, потому что каждый из них представляет собой единую кодовую единицу. Сломаются смайлики, эмодзи и разложенные метки. Для полного корректной обработки в вашем собственном коде используйте Intl.Segmenter с графемной детализации.
Мой текст отправлен на сервер?
Нет. Поворот происходит локально в вашем браузере при вводе - текст никогда не загружается. Это делает его безопасным для перестановки чувствительных или частных строк.
Как проверить, является ли слово палиндромом?
повернуть его с помощью струна реверс инструмент и сравнить с оригиналом. если они'являются идентичными, it's палиндром. для фраз удалите пробелы, пунктуацию и различия падежей перед сравнением - "A man a plan a canal Panama" является палиндромом только после нормализации.
Может ли он обрабатывать очень длинный текст?
да. Поскольку он работает в вашем браузере, практическим ограничением является память вашего устройства, которая удобно охватывает миллионы символов. Он меняется в режиме реального времени, когда вы печатаете, поэтому чрезвычайно большие пасты могут казаться немного менее мгновенными, но нет сервера туда и обратно.
Почему переворачивание строки является таким распространенным вопросом для интервью?
Он объединяет множество основ в одну небольшую задачу: манипулирование массивами и строками, метод двухочковых, компромиссы на месте и копирование, рекурсия и - если интервьюер острый - крайние случаи Юникода. Это & # 39; легко начать и имеет достаточную глубину, чтобы отделить быстрый ответ от тщательного.
Связанные инструменты:



