13 KiB
title | localeTitle |
---|---|
Palindrome Checker | Palindrome Checker |
Не забудьте использовать Read-Search-Ask
если вы застряли. Попробуйте подключить программу и напишите свой собственный код
Проблема Объяснение:
Наша цель для решения этой проблемы - убрать строку, переданную в систему, и проверить, является ли она фактически палиндром.
- Если вы не уверены в том, что такое палиндром, это слово или фраза, что при обратном заклинаниях одно и то же вперед или назад. Простым примером является
mom
, когда вы меняете буквы, это говорит то же самое! Другим примером палиндрома являетсяrace car
. Когда мы вынимаем все, что не является персонажем, он становитсяracecar
который является тем же, что и раньше или назад!
Как только мы определили, является ли это палиндром или нет, мы хотим вернуть либо true
либо false
основанное на наших выводах.
Связанные ссылки
Подсказка: 1
Регулярные выражения, RegEx
, могут использоваться для удаления нежелательных символов из строки.
попытаться решить проблему сейчас
Подсказка: 2
Здесь Array.prototype.split
Array.prototype.join
методы Array.prototype.split
и Array.prototype.join
. For
и в while
петли - еще одна альтернатива, или почему даже map
!
попытаться решить проблему сейчас
Подсказка: 3
String.prototype.toLowerCase
можно использовать для создания строчной строки.
попытаться решить проблему сейчас
Осторожно, спойлеры!
Решение впереди!
Решение базового кода:
function palindrome(str) {
return str.replace(/[\W_]/g, '').toLowerCase() ===
str.replace(/[\W_]/g, '').toLowerCase().split('').reverse().join('');
}
Код Объяснение:
-
Мы начинаем с использования регулярных выражений, чтобы заменить любые пробелы или не буквенно-цифровые символы ничем (или
null
), что существенно удаляет их из строки. -
Далее цепь
.toLowerCase()
, чтобы удалить все заглавные буквы , потому что является иной характер , чем .A
a
Проблема не просила нас беспокоиться о том, чтобы убедиться, что персонажи были идентичны, просто написание. -
Наш следующий шаг - взять нашу строку и
.split()
it,.reverse()
и, наконец,.join()
обратно. -
Последний шаг - проверить, что строка одна и та же форварды и назад, и верните наш результат!
Связанные ссылки
Решение промежуточного кода:
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;
}
Код Объяснение:
-
Мы начнем с использования тех же методов замены символов, которые нам не нужны в строке с использованием
RegEx
, а затем сделаем нашу строку строчной. -
Затем мы настраиваем цикл
for
и объявляем индексi
для отслеживания цикла. Мы устанавливаем нашу escape-последовательность, когдаi
больше длины строки, деленной на две, которая сообщает, что цикл останавливается после половины точки строки. И, наконец, мы устанавливаемi
для увеличения после каждого цикла. -
Внутри каждого цикла мы хотим проверить, что буква в элементе
[i]
равна букве в длине строки минус i,[str.length - i]
. Каждый цикл, элемент, который проверяется с обеих сторон строки, приближается к центру, пока мы не проверим все буквы. Если в какой-то момент буквы не совпадают, мы возвращаемfalse
. Если цикл завершается успешно, это означает, что у нас есть палиндром, и поэтому мы возвращаемtrue
!
Связанные ссылки
- Regex
Расширенное решение кода (наиболее эффективное):
//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
}
Код Объяснение:
-
Мне дали эту проблему в интервью (спойлер: я не был нанят ) Я быстро пришел к основному решению, и интервьюер сказал мне сделать это лучше. Алгоритм займет слишком много времени, если он передаст Библию в качестве строки. Он хотел, чтобы это было мгновенно.
-
Более простые решения очень плохо работают на длинных строках, потому что они работают со всей строкой несколько раз (toLowerCase (), replace (), split (), reverse (), join ()), прежде чем сравнивать всю строку в два раза.
-
Красота этого решения заключается в том, что ему никогда не нужно читать всю цепочку, даже однажды, чтобы знать, что это не палиндром. Зачем читать всю строку, если вы можете сказать, что это не палиндром, просто глядя на две буквы?
-
Использует цикл while вместо цикла for как наилучшую практику - потому что мы используем две переменные, один из которых является индексом, начинающимся с начала строки, а другой начинается в конце строки.
Связанные ссылки
ПРИМЕЧАНИЯ ДЛЯ ВЗНОСОВ:
- НЕ добавляйте решения, похожие на любые существующие решения. Если вы считаете, что это похоже, но лучше , попробуйте объединить (или заменить) существующее подобное решение.
- Добавьте объяснение своего решения.
- Классифицируйте решение в одной из следующих категорий - Basic , Intermediate и Advanced .
- Пожалуйста, добавьте свое имя пользователя, только если вы добавили соответствующее основное содержимое . ( НЕ удаляйте существующие имена пользователей )
Увидеть
Wiki Challenge Solution Template
дляWiki Challenge Solution Template
для справки.