Практика: Перевернуть строку.
Читая статьи на Хабре иногда попадается что программистам на собеседованиях задают следующее задание.
Нужно создать функцию которая будет принимать любую текстовую строку и возвращать эту же строку, только в перевернутом виде. Тоесть передаем 'Привет мир!' получаем '!рим тевирП'. Это задание задавалось для программистов знающих 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, время: 00:08. |