Реализуйте функцию reverse которая переворачивает строку
Задачку сделать обратный ход строки на JavaScript очень часто задают на технических собеседованиях. Вас могут попросить написать код для переворачивания строки разными методами, например, без использования встроенных методов или с помощью рекурсии.
Потенциально существуют десятки различных способов реализовать алгоритм. В этой статье будут приведены три интересных способа решения задачи переворачивания строки на JavaScript, которые предложила в своем блоге программист Соня Мойссет.
Итак, задача
Написать алгоритм на JavaScript, который перевернет строку «hello».
Решения
1. Обращаем строку с помощью встроенных функций в JS
В алгоритме мы будем использовать три метода: метод String.prototype.split(), метод Array.prototype.reverse() и метод Array.prototype.join().
- Метод split() разбивает объект string на массив строк путём разделения строки указанной подстрокой.
- Метод reverse() на месте обращает порядок следования элементов массива. Первый элемент массива становится последним, а последний — первым.
- Метод join() объединяет все элементы массива в строку.
Шаг 1. Используем split() метод, чтобы вернуть новый массив.
Шаг 2. Используем reverse() метод, чтобы перевернуть созданный массив.
Шаг 3. Используем join() метод, чтобы соединить все элементы массива в строку.
Шаг 4. Возвращаем перевернутую строку.
function reverseString(str) < var splitString = str.split(""); // var splitString = "hello".split(""); // ["h", "e", "l", "l", "o"] var reverseArray = splitString.reverse(); // var reverseArray = ["h", "e", "l", "l", "o"].reverse(); // ["o", "l", "l", "e", "h"] var joinArray = reverseArray.join(""); // var joinArray = ["o", "l", "l", "e", "h"].join(""); // "olleh" return joinArray; // "olleh" >reverseString("hello");
Три метода вместе:
function reverseString(str) < return str.split("").reverse().join(""); >reverseString("hello");
2. Переворачиваем строку с помощью цикла
Шаг 1. Создаем пустую строку, в которой будет размещаться новая строка.
Шаг 2. Создаем цикл FOR.
Шаг 3. Возвращаем перевернутую строку.
function reverseString(str) < var newString = ""; /* Стартовой точкой для цикла будет (str.length - 1), что соответствует последнему символу строки — "o" До тех пор, пока i больше или равно 0, цикл будет работать Мы уменьшаем i после каждой итерации */ for (var i = str.length - 1; i >= 0; i--) < newString += str[i]; // или newString = newString + str[i]; >/* Длина нашей строки «hello» равна пяти Для каждой итерации: i = str.length – 1 и newString = newString + str[i] 1-я: i = 5 - 1 = 4, newString = "" + "o" = "o" 2-я: i = 4 - 1 = 3, newString = "o" + "l" = "ol" 3-я: i = 3 - 1 = 2, newString = "ol" + "l" = "oll" 4-я: i = 2 - 1 = 1, newString = "oll" + "e" = "olle" 5-я: i = 1 - 1 = 0, newString = "olle" + "h" = "olleh" Конец цикла*/ return newString; // "olleh" > reverseString('hello');
3. Переворачиваем строку с помощью рекурсии
Для этого решения мы будем использовать два метода: метод String.prototype.substr() и метод String.prototype.charAt().
Метод substr() возвращает указанное количество символов из строки, начиная с указанной позиции.
"hello".substr(1); // "ello"
Метод charAt() возвращает указанный символ из строки.
"hello".charAt(0); // «h"
Глубина рекурсии равна длине строки. Этот способ решения будет не самым удобным, если строка будет очень длинной.
function reverseString(str) < if (str === "") // Завершение рекурсии return ""; else return reverseString(str.substr(1)) + str.charAt(0); /* Первая часть метода рекурсии. Вы должны помнить, что у вас не будет одного вызова функции, у вас будет несколько вложен ных вызовов. Each call: str === "?" reverseString(str.subst(1)) + str.charAt(0) 1-й вызов – reverseString("Hello») вернет reverseString("ello») + "h" 2-й вызов – reverseString("ello") вернет reverseString("llo") + "e" 3-й вызов – reverseString("llo") вернет reverseString("lo") + "l" 4-й вызов – reverseString("lo") вернет reverseString("o") + "l" 5-й вызов – reverseString("o") вернет reverseString("") + "o" Вторая часть метода рекурсии. Метод попадает в условие if и наиболее вложенный вызов немедленно возвращается. 5-й вызов вернет reverseString("") + "o" = "o" 4-й вызов вернет reverseString("o") + "l" = "o" + "l" 3-й вызов вернет reverseString("lo") + "l" = "o" + "l" + "l" 2-й вызов вернет reverserString("llo") + "e" = "o" + "l" + "l" + "e" 1-й вызов вернет reverserString("ello") + "h" = "o" + "l" + "l" + "e" + "h" */ >reverseString("hello");
Заключение
Практиковать написание алгоритмов на языках программирования — полезное занятие для развития логики и отличная практика кодирования. Задачу обратной строки можно решить несколькими способами: пойти по короткому пути или воспользоваться более сложными методами. Надеемся, что статья была вам полезна!
Ruby: Обход строки
Для закрепления блоков рассмотрим ещё один пример итерации – обход строки. В большинстве языков для обхода строки есть два варианта:
- Преобразование строки в массив символов и обход этого массива
- Проход по числам от нуля до длины строки — 1. Обращение к символам по индексу.
В таких моментах проявляется выразительность Ruby и мощь его встроенной библиотеки. Для обхода строки ничего не нужно придумывать, всё уже встроено:
company_name = 'hexlet' company_name.each_char do |c| # c – значит char puts c end # => h # => e # => x # => l # => e # => t
Метод each_char() определен именно на строке.
Ниже чуть более сложный пример с агрегацией. Код, который считает количество букв e в строке:
company_name = 'hexlet' letters_count = 0 company_name.each_char do |c| if c == 'e' letters_count += 1 end end
Задание
Реализуйте функцию reverse() , которая переворачивает строку. Не используйте в своем решении метод строки reverse
reverse 'hexlet' # telxeh reverse 'basics' # scisab
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Array.prototype.reverse()
Метод reverse() на месте обращает порядок следования элементов массива. Первый элемент массива становится последним, а последний — первым.
Интерактивный пример
Синтаксис
array.reverse()
Параметры
Возвращаемое значение
Описание
Метод reverse() на месте переставляет элементы массива, на котором он был вызван, изменяет массив и возвращает ссылку на него.
Примеры
Пример: обращение порядка элементов в массиве
В следующем примере создаётся массив myArray , содержащий три элемента, а затем массив переворачивается.
var myArray = ["один", "два", "три"]; myArray.reverse(); console.log(myArray); // ['три', 'два', 'один']
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-array.prototype.reverse |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
- Array.prototype.join()
- Array.prototype.sort()
- TypedArray.prototype.reverse() (en-US)
Clojure: Строки
Строки в Clojure, являются экземплярами класса java.lang.String и к ним можно применять различные функции определенные в этом классе. Форма записи строк Clojure совпадает со стандартной записью строк в Java. Строки всегда представлены двойными кавычками.
(ns my-ns (:require [clojure.string :as s]) ; импортируем модуль работы со строками (def my-str "hello, world") (def splitted-str (s/split my-str #", ")) ; ["hello" "world"] (str my-str "!") ; "hello, world!" (s/join #", " splitted-str) ; "hello, world" (count my-str) ; 12
Работа со строками в целом типична, как и в большинстве языков программирования.
Задание
Реализуйте функцию str-reverse , которая переворачивает строку:
(str-reverse "Hello") ; "olleH" (str-reverse "") ; ""
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.