Может кто-нибудь объяснить, пожалуйста, это решение Palindrome - PullRequest
0 голосов
/ 26 сентября 2018

ОК, поэтому я пытаюсь улучшить свой JS, и я наткнулся на популярное упражнение по проверке Палиндрома.На этот раз это решение от freeCodeCamp должно работать очень хорошо, но я не могу понять некоторые его аспекты.

/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

    }

Теперь у меня есть несколько вопросов относительно этого кода:

1-Какой смысл уменьшать длину str на 1?Я видел это в нескольких контролерах Palindrome, и все еще не могу обернуть голову вокруг него.

2 - означает ли метод .match «вернуть истину, если аргумент содержит эти символы»?

3- почему "/ [\ W _] /" равняется "всем символам"?

4- какой смысл добавлять 1 и вычитать 1 вперед и назад?Особенно в конце функции.

Спасибо и извините, если это глупый вопрос, я просто очень заинтересован в понимании логики здесь.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Это одновременный просмотр передней части строки и ее конца и сравнение.В каждом цикле он перемещает вперед и назад назад:

loop 1
  amanaplanacanalpanama
  |                   |
front                back

front === back? if not it iss not a palindrome

loop 2 (front+1 & back -1)
  amanaplanacanalpanama
   |                 |
 front              back

front === back?

etc.

Если это продолжает возвращать true, у вас есть палиндром.

Проблема, с которой вы можете столкнуться, это палиндром, как:

мадам, я адам

' и пробелы портят, но большинство людей все еще называют это палиндромом.Вот почему у вас есть строка вроде:

str[back].match(/[\W_]/)

.match(/[\W_]/) проверяет, является ли буква буквой «не-слова», например, '' 'или даже пробелом, и перемещает переднюю часть указателя назад за ней,Это позволяет тесту не заботиться о пробелах и несловарных символах.

0 голосов
/ 26 сентября 2018

Чтобы ответить на ваш первый вопрос, «назад» - это указатель, который будет указывать на заднюю часть строки.Причина, по которой его значение равно str.length - 1, заключается в том, что str.length даст количество атрибутов в строке, хотя индекс начинается с 0. По этой причине вам нужно будет вычесть 1 из длины, чтобы получить индекспоследний атрибут.

Чтобы ответить на ваш последний вопрос, добавьте 1 / вычитая 1 из передней / задней части соответственно, чтобы увеличить проверяемые атрибуты друг против друга.Например, если строка была «abba», то после сравнения первой буквы с последней буквой счетчик будет увеличиваться, так что первый b (новый 'front') будет сравниваться со вторым b (новым 'back)«)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...