Javascript-форум (https://javascript.ru/forum/)
-   Учебные материалы (https://javascript.ru/forum/study/)
-   -   Практика: Перевернуть строку. (https://javascript.ru/forum/study/21652-praktika-perevernut-stroku.html)

Magneto 19.09.2011 12:47

Практика: Перевернуть строку.
 
Читая статьи на Хабре иногда попадается что программистам на собеседованиях задают следующее задание.

Нужно создать функцию которая будет принимать любую текстовую строку и возвращать эту же строку, только в перевернутом виде. Тоесть передаем 'Привет мир!' получаем '!рим тевирП'.

Это задание задавалось для программистов знающих PHP или C++, но я подумал "А как бы я решил это используя JavaScript". Решение получилось очень легким.

А как бы Вы решили это задание на JavaScript ?

P.S. Свое решение выложу ближе к вечеру. Хотя уверен что его предложат одним из первых.

Octane 19.09.2011 12:52

function reverseStr(str) {
    return str.split("").reverse().join("");
}

alert(reverseStr("Привет мир!"));

ваый 19.09.2011 14:22

Octane привел тривиальное (потому что очевидное) решение. Давайте подумаем, как еще можно это сделать. Просто ради фана. Хотя, видимо, самое правильное решение уже приведено, давайте поизвращаемся немного.
function reverseStr(str) {
    var newStr = '', i;
    for (i = str.length - 1; i >= 0; i--) {
        newStr += str.charAt(i);
    }
    return newStr;
}

alert(reverseStr('Привет мир!'));

Какие еще есть варианты функции reverseStr?

Magneto 19.09.2011 21:38

Хочу сказать что вначале это задание я решил следующим образом:
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('Привет мир, как дела!?'));

nyols 19.09.2011 23:11

Вариант который предложил Octane - компактный, но вариант от ваый вроде как быстрее (почти в два раза)

ваый 19.09.2011 23:30

Хо-хо! Действительно, в 2.5 раза быстрее!

Kolyaj 19.09.2011 23:51

var str = 'Привет мир!';
alert('\u202E' + str);

Magneto 19.09.2011 23:54

А как вы измеряете скорость?

Цитата:

Сообщение от Kolyaj
var str = 'Привет мир!';
alert('\u202E' + str);

Теперь бы вкратце услышать что здесь произошло. Ну или ссылку.

nyols 19.09.2011 23:56

Я тут

Kolyaj,
а что с этими строчками ? :)

devote 20.09.2011 00:02

Цитата:

Сообщение от Magneto
Теперь бы вкратце услышать что здесь произошло. Ну или ссылку.

Unicode Character 'RIGHT-TO-LEFT OVERRIDE' (U+202E)

Триви 20.09.2011 00:03

Цитата:

Сообщение от Magneto (Сообщение 127076)
.....Это задание задавалось для программистов знающих PHP.....

PHP всегда сам всё делает за тебя strrev ;)

nyols 20.09.2011 00:05

Цитата:

Сообщение от devote
Unicode Character 'RIGHT-TO-LEFT OVERRIDE' (U+202E)

Мне ссылка не помогла понять что происходит))

В том алерте я увидел тот же "Привет мир" только с квадратиком вначале)))

Kolyaj 20.09.2011 00:09

Цитата:

Сообщение от nyols
В том алерте я увидел тот же "Привет мир" только с квадратиком вначале)))

Браузер хреново юникод поддерживает, значит.

Magneto 20.09.2011 00:15

Понятно, этот юникод символ сигнализирует браузеру что дальше будет использованно письмо справа налево и браузер автоматом переворачивает строку. Что немного не соответствует поставленной задачи. А так да прикольно.

Gvozd 20.09.2011 00:44

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.