Практика: Перевернуть строку.
Читая статьи на Хабре иногда попадается что программистам на собеседованиях задают следующее задание.
Нужно создать функцию которая будет принимать любую текстовую строку и возвращать эту же строку, только в перевернутом виде. Тоесть передаем 'Привет мир!' получаем '!рим тевирП'. Это задание задавалось для программистов знающих PHP или C++, но я подумал "А как бы я решил это используя JavaScript". Решение получилось очень легким. А как бы Вы решили это задание на JavaScript ? P.S. Свое решение выложу ближе к вечеру. Хотя уверен что его предложат одним из первых. |
function reverseStr(str) { return str.split("").reverse().join(""); } alert(reverseStr("Привет мир!")); |
Octane привел тривиальное (потому что очевидное) решение. Давайте подумаем, как еще можно это сделать. Просто ради фана. Хотя, видимо, самое правильное решение уже приведено, давайте поизвращаемся немного.
function reverseStr(str) { var newStr = '', i; for (i = str.length - 1; i >= 0; i--) { newStr += str.charAt(i); } return newStr; } alert(reverseStr('Привет мир!')); Какие еще есть варианты функции reverseStr? |
Хочу сказать что вначале это задание я решил следующим образом:
function reverse (data) { var letters = [], l = data.length; while (l--) { letters.push(data[l]); } return letters.join(''); } alert(reverse('Это обычный текст.')); В обратном цикле со строки вытаскиваем символы и помещаем их в массив, после этот массив преобразуем в строку. Немного поразмыслив решил что логичней использовать нативный метод который есть у массивов, reverse(): function reverse (str) { var letters = str.split(''); letters.reverse(); return letters.join(''); } alert(reverse('Привет мир, как дела!?')); Ну и дальше оптимизация: function reverse (str) { return str.split('').reverse().join(''); } alert(reverse('Привет мир, как дела!?')); |
Вариант который предложил Octane - компактный, но вариант от ваый вроде как быстрее (почти в два раза)
|
Хо-хо! Действительно, в 2.5 раза быстрее!
|
var str = 'Привет мир!'; alert('\u202E' + str); |
А как вы измеряете скорость?
Цитата:
|
|
Цитата:
|
Цитата:
|
Цитата:
В том алерте я увидел тот же "Привет мир" только с квадратиком вначале))) |
Цитата:
|
Понятно, этот юникод символ сигнализирует браузеру что дальше будет использованно письмо справа налево и браузер автоматом переворачивает строку. Что немного не соответствует поставленной задачи. А так да прикольно.
|
function reverseStr(str) { return Array.prototype.reduce.call(str, function(c1, c2) {return c2 + c1;}); } alert(reverseStr('Привет мир!')); похожим образом можно использовать reduceRight, map, every, some, forEach, и черт знает что еще вот только скорость подводит у всех этих решений(раза в два-три) |
Часовой пояс GMT +3, время: 07:48. |