freeCodeCamp/guide/russian/certifications/javascript-algorithms-and-d.../javascript-algorithms-and-d.../palindrome-checker/index.md

13 KiB
Raw Blame History

title localeTitle
Palindrome Checker Palindrome Checker

:triangular_flag_on_post: Не забудьте использовать Read-Search-Ask если вы застряли. Попробуйте подключить программу :busts_in_silhouette: и напишите свой собственный код :pencil:

:checkered_flag: Проблема Объяснение:

Наша цель для решения этой проблемы - убрать строку, переданную в систему, и проверить, является ли она фактически палиндром.

  • Если вы не уверены в том, что такое палиндром, это слово или фраза, что при обратном заклинаниях одно и то же вперед или назад. Простым примером является mom , когда вы меняете буквы, это говорит то же самое! Другим примером палиндрома является race car . Когда мы вынимаем все, что не является персонажем, он становится racecar который является тем же, что и раньше или назад!

Как только мы определили, является ли это палиндром или нет, мы хотим вернуть либо true либо false основанное на наших выводах.

Связанные ссылки

:speech_balloon: Подсказка: 1

Регулярные выражения, RegEx , могут использоваться для удаления нежелательных символов из строки.

попытаться решить проблему сейчас

:speech_balloon: Подсказка: 2

Здесь Array.prototype.split Array.prototype.join методы Array.prototype.split и Array.prototype.join . For и в while петли - еще одна альтернатива, или почему даже map !

попытаться решить проблему сейчас

:speech_balloon: Подсказка: 3

String.prototype.toLowerCase можно использовать для создания строчной строки.

попытаться решить проблему сейчас

Осторожно, спойлеры!

предупреждающий знак

Решение впереди!

:beginner: Решение базового кода:

    function palindrome(str) { 
      return str.replace(/[\W_]/g, '').toLowerCase() === 
             str.replace(/[\W_]/g, '').toLowerCase().split('').reverse().join(''); 
    } 

:rocket: Код запуска

Код Объяснение:

  • Мы начинаем с использования регулярных выражений, чтобы заменить любые пробелы или не буквенно-цифровые символы ничем (или null ), что существенно удаляет их из строки.

  • Далее цепь .toLowerCase() , чтобы удалить все заглавные буквы , потому что является иной характер , чем . A a Проблема не просила нас беспокоиться о том, чтобы убедиться, что персонажи были идентичны, просто написание.

  • Наш следующий шаг - взять нашу строку и .split() it, .reverse() и, наконец, .join() обратно.

  • Последний шаг - проверить, что строка одна и та же форварды и назад, и верните наш результат!

Связанные ссылки

:sunflower: Решение промежуточного кода:

    function palindrome(str) { 
      str = str.toLowerCase().replace(/[\W_]/g, ''); 
      for(var i = 0, len = str.length - 1; i < len/2; i++) { 
        if(str[i] !== str[len-i]) { 
          return false; 
        } 
      } 
      return true; 
    } 

:rocket: Код запуска

Код Объяснение:

  • Мы начнем с использования тех же методов замены символов, которые нам не нужны в строке с использованием RegEx , а затем сделаем нашу строку строчной.

  • Затем мы настраиваем цикл for и объявляем индекс i для отслеживания цикла. Мы устанавливаем нашу escape-последовательность, когда i больше длины строки, деленной на две, которая сообщает, что цикл останавливается после половины точки строки. И, наконец, мы устанавливаем i для увеличения после каждого цикла.

  • Внутри каждого цикла мы хотим проверить, что буква в элементе [i] равна букве в длине строки минус i, [str.length - i] . Каждый цикл, элемент, который проверяется с обеих сторон строки, приближается к центру, пока мы не проверим все буквы. Если в какой-то момент буквы не совпадают, мы возвращаем false . Если цикл завершается успешно, это означает, что у нас есть палиндром, и поэтому мы возвращаем true !

Связанные ссылки

  • Regex

:rotating_light: Расширенное решение кода (наиболее эффективное):

    //this solution performs at minimum 7x better, at maximum infinitely better. 
    //read the explanation for the reason why. I just failed this in an interview. 
    function palindrome(str) { 
      //assign a front and a back pointer 
      let front = 0 
      let back = str.length - 1 
 
      //back and front pointers won't always meet in the middle, so use (back > front) 
      while (back > front) { 
        //increments front pointer if current character doesn't meet criteria 
        if ( str[front].match(/[\W_]/) ) { 
          front++ 
          continue 
        } 
        //decrements back pointer if current character doesn't meet criteria 
        if ( str[back].match(/[\W_]/) ) { 
          back-- 
          continue 
        } 
        //finally does the comparison on the current character 
        if ( str[front].toLowerCase() !== str[back].toLowerCase() ) return false 
        front++ 
        back-- 
      } 
 
      //if the whole string has been compared without returning false, it's a palindrome! 
      return true 
 
    } 

:rocket: Код запуска

Код Объяснение:

  • Мне дали эту проблему в интервью (спойлер: я не был нанят :frowning: ) Я быстро пришел к основному решению, и интервьюер сказал мне сделать это лучше. Алгоритм займет слишком много времени, если он передаст Библию в качестве строки. Он хотел, чтобы это было мгновенно.

  • Более простые решения очень плохо работают на длинных строках, потому что они работают со всей строкой несколько раз (toLowerCase (), replace (), split (), reverse (), join ()), прежде чем сравнивать всю строку в два раза.

  • Красота этого решения заключается в том, что ему никогда не нужно читать всю цепочку, даже однажды, чтобы знать, что это не палиндром. Зачем читать всю строку, если вы можете сказать, что это не палиндром, просто глядя на две буквы?

  • Использует цикл while вместо цикла for как наилучшую практику - потому что мы используем две переменные, один из которых является индексом, начинающимся с начала строки, а другой начинается в конце строки.

Связанные ссылки

:clipboard: ПРИМЕЧАНИЯ ДЛЯ ВЗНОСОВ:

  • :warning: НЕ добавляйте решения, похожие на любые существующие решения. Если вы считаете, что это похоже, но лучше , попробуйте объединить (или заменить) существующее подобное решение.
  • Добавьте объяснение своего решения.
  • Классифицируйте решение в одной из следующих категорий - Basic , Intermediate и Advanced . :traffic_light:
  • Пожалуйста, добавьте свое имя пользователя, только если вы добавили соответствующее основное содержимое . ( :warning: НЕ удаляйте существующие имена пользователей )

Увидеть :point_right: Wiki Challenge Solution Template для Wiki Challenge Solution Template для справки.