DevGang
Авторизоваться

Проверка палиндрома JavaScript

Давайте вместе рассмотрим одно из возможных решений для распространенного алгоритма: средство проверки палиндромов.

Используя Javascript, создайте функцию, которая получает один аргумент, строку. Функция должна возвращать true, если строка является палиндромом, и возвращать false, если строка не является палиндромом.

Что такое палиндром?

Согласно Merriam-Webster, палиндром это:

любое слово, число или фраза, которые одинаково читаются вперед или назад.

Некоторые основные примеры: mom, civic, kayak, Hannah и 1881. Более сложными примерами являются фразы с пробелами, такие как: «race car» и «taco cat». Еще более сложными (и часто глупыми) примерами являются фразы, в которых игнорируются пробелы и знаки препинания, такие как: «Yo, Banana Boy!», «A man, a plan, a canal, Panama!» и «Madam, in Eden, I’m Adam».

Итак, как мы можем создать функцию, которая возвращает true для каждого из этих случаев?

Написание наших тестовых случаев

Прежде чем мы начнем, мы напишем несколько тестовых случаев, чтобы проверить наш код, когда мы будем использовать console.log().

Чтобы просмотреть вывод консоли, установите и запустите Node JS или используйте песочницу, например codesandbox.io.

Наши тесты:

  console.log("Expecting: false");
  console.log("Test 1:", isPalindrome('testing'))

  console.log('Expecting: true');
  console.log('Test 2:', isPalindrome('mom'))

  console.log("Expecting: true");
  console.log("Test 3:", isPalindrome("kayak"));

  console.log("Expecting: true");
  console.log("Test 4:", isPalindrome("1881"));

  console.log("Expecting: true");
  console.log("Test 5:", isPalindrome("Hannah"));

  console.log("Expecting: true");
  console.log("Test 6:", isPalindrome("race car"));

  console.log("Expecting: true");
  console.log("Test 7:", isPalindrome("A man, a plan, a canal, Panama!"));

  console.log("Expecting: true");
  console.log("Test 8:", isPalindrome("  Madam, in Eden, I’m Adam."));

Написание нашей функции

Мы начнем с основного синтаксиса функции, взяв нашу строку в качестве аргумента.

function isPalindrome(string) {
}

Затем, используя оператор распространения, мы распространим нашу строку в новый массив и сохраним его в переменной stringArray.

function isPalindrome(string) {
  const stringArray = [...string]; //NEW!
}

Мы создадим новый пустой массив для хранения нашей перевернутой строки.

function isPalindrome(string) {
  const stringArray = [...string];
  const newArray = []; //NEW!
}

Затем, используя цикл for-each, мы перебираем каждый индекс в нашем stringArray и, используя .unshift(), добавляем этот элемент в начало newArray, эффективно меняя строку.

function isPalindrome(string) {
  const stringArray = [...string];
  const newArray = [];
  stringArray.forEach(element => { //NEW!
    newArray.unshift(element);     //NEW!
  });                              //NEW!
}

Теперь мы можем вызвать метод .join() для newArray с пустой строкой в ​​качестве параметра, чтобы объединить все элементы для формирования новой строки. Мы сохраним это в переменную reversedString.

function isPalindrome(string) {
  const wordArray = [...string];
  const newArray = [];
  wordArray.forEach(index => {
    newArray.unshift(index);
  });
  const reversedString = newArray.join(''); //NEW!
}

Чтобы закрыть нашу функцию, мы сравним нашу исходную строку с новой reversedString, используя оператор строгого равенства ===. Это вернет логическое значение, true или false. Включите оператор return, чтобы вернуть логическое значение, тем самым указав, является ли строка палиндромом или нет.

function isPalindrome(string) {
  const wordArray = [...string];
  const newArray = [];
  wordArray.forEach(index => {
    newArray.unshift(index);
  });
  const reversedString = newArray.join('');  //NEW!
  return string === reversedString;          //NEW!
}

Когда мы проверяем это на наших тестах, проходят только тесты с 1 по 4!

Пока что наш код не учитывает заглавные буквы, пробелы и знаки препинания.

Чтобы такая строка, как Hannah, прошла тест, нам нужно преобразовать все наши буквы в нижний регистр, вызвав метод .toLowerCase() для нашей строки. Затем мы сохраняем его в string переменную, чтобы обновить это значение.

function isPalindrome(string) {
  string = string.toLowerCase();  //NEW!
  const wordArray = [...string];
  const newArray = [];
  wordArray.forEach(index => {
    newArray.unshift(index);
  });
  const reversedString = newArray.join('');  
  return string === reversedString;         
}

Теперь мы видим, что тест 5 пройден.

Чтобы исключить знаки препинания и пробелы, мы можем вызвать метод .replace() и использовать шаблон регулярного выражения в качестве первого параметра для идентификации этих символов.

В нашем коде этот метод будет выглядеть так: .replace(/\W|_/g, '')

Давайте разберем это:

  • Шаблоны RegEx заключаются в две косые черты //.
  • \W — это шаблон RegEx для «не буквенно-цифровых» символов.
  • |_ — это оператор регулярного выражения «или» и знак подчеркивания. Мы должны включить это, потому что подчеркивание не включено в приведенное выше выражение.
  • Флаг g следует за выражением RegEx и выполняет глобальный поиск, просматривая всю строку и возвращая все совпадения.
  • Мы устанавливаем второй параметр нашего метода .replace() в пустую строку, чтобы «стереть» эти символы из нашей обновленной string.

Если сложить все воедино, то получим:

function isPalindrome(string) {
  string = string.toLowerCase().replace(/\W/g, '');  //NEW!
  const stringArray = [...string];
  const newArray = [];
  stringArray.forEach(index => {
    newArray.unshift(index);
  });
  const reversedString = newArray.join('');
  console.log(string);
  return string === reversedString;
}

Все 8 наших тестов проходят нашу проверку палиндромов

#JavaScript #Алгоритмы
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу