Как вы переворачиваете строку на месте (или на месте) в JavaScript, когда она передается функции с оператором return, без использования встроенных функций ( .reverse()
и .charAt()
т. Д.)?
javascript
string
reverse
Кобе
источник
источник
Ответы:
Пока вы имеете дело с простыми символами ASCII и счастливы использовать встроенные функции, это будет работать:
Если вам нужно решение, которое поддерживает UTF-16 или другие многобайтовые символы, имейте в виду, что эта функция выдаст недопустимые строки юникода или допустимые строки, которые выглядят забавно. Возможно, вы захотите рассмотреть этот ответ вместо .
[... s] поддерживает Unicode, небольшое редактирование дает: -
источник
return [...s].reverse().join("");
может работать.Следующий метод (или аналогичный) обычно используется для обращения строки в JavaScript:
Фактически, все ответы, опубликованные до сих пор, являются вариацией этого паттерна. Однако есть некоторые проблемы с этим решением. Например:
Если вам интересно, почему это происходит, ознакомьтесь с внутренней кодировкой символов JavaScript . (TL; DR:
𝌆
это астральный символ, и JavaScript представляет его как две отдельные единицы кода.)Но есть еще:
Хорошая строка для тестовой строки обратных реализаций следующего :
Почему? Потому что он содержит астральный символ (
𝌆
) (который представлен суррогатными парами в JavaScript ) и знак объединения (ñ
последний вmañana
действительности фактически состоит из двух символов: U + 006E МАЛЕНЬКОЕ ПИСЬМО N и U + 0303 КОМБИНИРОВАННАЯ ТИЛЬДА).Порядок, в котором появляются суррогатные пары, изменить нельзя, иначе астральный символ больше не будет отображаться в «перевернутой» строке. Вот почему вы видели эти
��
отметки в выходных данных для предыдущего примера.Комбинированные метки всегда применяются к предыдущему символу, поэтому вы должны рассматривать оба основных символа (U + 006E LATIN SMALL LETTER N) как комбинирующие метки (U + 0303 COMBINING TILDE) в целом. Изменение их порядка приведет к объединению метки объединения с другим символом в строке. Вот почему выходной пример имел
ã
вместоñ
.Надеюсь, это объясняет, почему все ответы, опубликованные до сих пор, неверны .
Чтобы ответить на ваш первоначальный вопрос - как [правильно] перевернуть строку в JavaScript - я написал небольшую библиотеку JavaScript, способную переворачивать строки с поддержкой Unicode. Это не имеет никаких проблем, которые я только что упомянул. Библиотека называется Esrever ; его код находится на GitHub, и он работает практически в любой среде JavaScript. Он поставляется с утилитой оболочки / бинарной, так что вы можете легко перевернуть строки из вашего терминала, если хотите.
Что касается части «на месте», см. Другие ответы.
источник
или
источник
Детальный анализ и десять различных способов перевернуть строку и детали их исполнения.
http://eddmann.com/posts/ten-ways-to-reverse-a-string-in-javascript/
Выполнение этих реализаций:
Наиболее эффективные реализации для каждого браузера
Вот эти реализации:
Реализация 1:
Реализация 2:
Реализация 3:
Реализация 4:
Реализация 5:
Реализация 6:
Реализация 7:
Реализация 8:
Реализация 9:
Реализация 10
источник
Целое «перевернуть строку на месте» - это устаревший вопрос для программистов на С, и люди, которые брали у них интервью (возможно, для мести?), Спросят. К сожалению, это часть «На месте», которая больше не работает, потому что строки практически в любом управляемом языке (JS, C # и т. Д.) Используют неизменяемые строки, что разрушает всю идею перемещения строки без выделения новой памяти.
Хотя приведенные выше решения действительно обращают строку, они не делают это, не выделяя больше памяти, и, следовательно, не удовлетворяют условиям. Вы должны иметь прямой доступ к выделенной строке и иметь возможность манипулировать ее исходным местоположением в памяти, чтобы иметь возможность обратить ее на место.
Лично я действительно ненавижу такие вопросы на собеседовании, но, к сожалению, я уверен, что мы будем видеть их в течение многих лет.
источник
Сначала используйте,
Array.from()
чтобы превратить строку в массив, затемArray.prototype.reverse()
повернуть массив, а затемArray.prototype.join()
сделать его обратно строкой.источник
reverse
логику.string.split('')
не работает. Смотрите этот ответ для более подробного объяснения.Array.from('foo 𝌆 bar mañana mañana').reverse().join('') == 'anãnam anañam rab 𝌆 oof'
Array.from('foo 𝌆 bar mañana mañana'.normalize('NFC')).reverse().join('')
станет"anañam anañam rab 𝌆 oof"
В ECMAScript 6 вы можете перевернуть строку еще быстрее, не используя
.split('')
метод split, с помощью оператора распространения, например, так:источник
('')
string.split('')
понятнее для большинства людей, чем[...string]
..split('')
есть проблема с символами из дополнительных плоскостей (суррогатные пары в UTF-16), потому что она разделяется на единицу кода UTF-16, а не на кодовую точку . Оператор спреда иArray.from()
(мои предпочтения) нет.Кажется, я на три года опоздал на вечеринку ...
К сожалению, вы не можете, как было указано. Видеть Являются ли строки JavaScript неизменяемыми? Нужен ли мне «строитель строк» в JavaScript?
Следующая лучшая вещь, которую вы можете сделать, это создать «представление» или «оболочку», которая принимает строку и переопределяет любые части используемого вами строкового API, но притворяется, что строка обратная. Например:
Демо-версия:
Кикер - следующее делается на месте чистой математикой, посещая каждого персонажа только один раз и только при необходимости:
Это дает значительную экономию при применении к очень большой строке, если вы берете только относительно небольшой ее фрагмент.
Стоит ли это того (по сравнению с копией, как в большинстве языков программирования), во многом зависит от вашего варианта использования и от того, насколько эффективно вы переопределите строковый API. Например, если все, что вам нужно, это манипулировать строковым индексом или брать маленькие
slice
s илиsubstr
s, это сэкономит вам пространство и время. Однако если вы планируете печатать большие перевернутые фрагменты или подстроки, экономия может быть небольшой, даже хуже, чем при создании полной копии. Ваша «перевернутая» строка также не будет иметь типstring
, хотя вы могли бы подделать это с помощью прототипирования.Приведенная выше демонстрационная реализация создает новый объект типа ReversedString. Он является прототипом и, следовательно, довольно эффективным, с почти минимальной работой и минимальными затратами пространства (определения прототипа являются общими). Это ленивая реализация, включающая отложенную нарезку. Всякий раз, когда вы выполняете функцию, подобную
.slice
или.reversed
, она выполняет индексную математику. Наконец, когда вы извлекаете данные (путем неявного вызова.toString()
или.charCodeAt(...)
чего-то еще), они применяют их «умным» способом, затрагивая как можно меньше данных.Примечание: приведенный выше строковый API является примером и может быть реализован не полностью. Вы также можете использовать только 1-2 функции, которые вам нужны.
источник
Есть много способов перевернуть строку в JavaScript. Я записываю три способа, которые предпочитаю.
Подход 1: Использование обратной функции:
Подход 2: перебирая символы:
Подход 3: Использование функции снижения:
Надеюсь, это поможет :)
источник
Во время интервью меня попросили перевернуть строку без использования каких-либо переменных или нативных методов. Это моя любимая реализация:
источник
slice
? : - /Array.prototype.reverse()
.Есть несколько способов сделать это, вы можете проверить следующее,
1. Традиционный цикл (увеличение):
2. Традиционный цикл (убывающий):
3. Использование for-of loop
4. Используя метод массива forEach / high order:
5. Стандарт ES6:
6. Последний способ:
7. Вы также можете получить результат, используя следующее,
источник
В ES6 у вас есть еще один вариант
источник
Я думаю, это самый простой способ
источник
Array.prototype.reverse()
это было бы самым простым способом, поэтому самый популярный ответ. Конечно, это потребовало бы хорошего предварительного знания JavaScript.ИЛИ
// Вывод: 'gnirts elpmas'
источник
[...str]
.Я знаю, что это старый вопрос, на который хорошо ответили, но для собственного удовольствия я написал следующую обратную функцию и подумал, что поделюсь ею на случай, если она пригодится кому-то еще. Он обрабатывает как суррогатные пары, так и комбинирующие метки:
Все подробности о Матиасе, Punycode и других справочных материалах, рассказывающих о сложностях кодирования символов в JavaScript.
источник
Вы не можете, потому что строки JS неизменны. Краткое не на месте решение
Показать фрагмент кода
источник
Если вы не хотите использовать какую-либо встроенную функцию. Попробуй это
источник
Реальный ответ таков: вы не можете повернуть его на месте, но вы можете создать новую строку, которая является обратной.
Как упражнение для игры с рекурсией: иногда, когда вы идете на собеседование, интервьюер может спросить вас, как сделать это с помощью рекурсии, и я думаю, что «предпочтительным ответом» может быть «Я бы не стал делать это в рекурсии, так как может легко вызвать переполнение стека "(потому что это
O(n)
не такO(log n)
. Если это такO(log n)
, переполнение стека довольно трудно - 4 миллиарда элементов могут быть обработаны с уровнем стека 32, так как 2 ** 32 - 4294967296. Но если этоO(n)
, то он может легко получить переполнение стека.Иногда интервьюер все еще спрашивает вас: «Как упражнение, почему бы вам не написать его с помощью рекурсии?» И вот оно:
тестовый забег:
вывод:
Чтобы попытаться получить переполнение стека, я переключился
1000
на10000
Google Chrome, и он сообщил:источник
Сами строки неизменяемы, но вы можете легко создать обратную копию с помощью следующего кода:
источник
источник
Перевернуть строку, используя встроенные функции
Перевернуть строку без помощников
источник
Небольшая функция, которая обрабатывает как диакритические знаки, так и двухбайтовые символы:
Обновить
Более полный список сочетаний диакритики:
источник
isCombiningDiacritic
функцию, чтобы включить все 316 диапазонов; не стесняйтесь предоставлять это редактирование, поскольку у вас, похоже, есть данные для передачи.источник
без преобразования строки в массив;
использование Array.reverse без преобразования символов в кодовые точки;
источник
var c = array[i-1]; array[i-1] = array[i]; array[i] = c;
не требует объединения пары кода. Кроме того, цикл for должен начинаться с 1.'\ud83c\ud83c\udfa5'.reverse()
- она будет выводить так же, как ввод. Добавление++i;
вif
заявлении должно исправить это.'a\u0303bc'.reverse() === 'cba\u0303'
касается сочетания диакритических знаков: должно возвращаться истина.Я думаю, что String.prototype.reverse - хороший способ решить эту проблему; код как ниже;
источник
Используя функции Array,
источник
источник
Моя собственная оригинальная попытка ...
http://jsbin.com/bujiwo/19/edit?js,console,output
источник
Держите это сухим и просто глупо!
источник
Ладно, довольно просто, вы можете создать функцию с простым циклом для обратной строки без использования
reverse()
иcharAt()
т. Д., Например:Например, у вас есть эта строка:
Создать такую функцию, я это называю
reverseString
...И вы можете назвать это как:
И результат будет:
источник