Почему мой код палиндрома работает для всех сценариев? - PullRequest
0 голосов
/ 05 августа 2020

Этот код возвращает истину для каждого сценария; он возвращает истину, если это палиндром, и возвращает истину, если это не палиндром.

 function isPalindrome(string){
  string = string.toLowerCase();
  var charactersArr = string.split(' ');
  var validCharacters = 'abcdefghijklmnopqrstuvwxyz'.split(' ');

  var lettersArr = [];
  charactersArr.forEach(char => {
    if (validCharacters.indexOf(char)> - 1) lettersArr.push(char);
  });
  return lettersArr.join(' ') === lettersArr.reverse().join(' ');
}
isPalindrome("Taco Cat");

Ответы [ 4 ]

1 голос
/ 05 августа 2020
function palindrome(str) {
 var re = /[^A-Za-z0-9]/g;
 str = str.toLowerCase().replace(re, '');
 var len = str.length;
 for (var i = 0; i < len/2; i++) {
   if (str[i] !== str[len - 1 - i]) {
       return false;
   }
 }
 return true;
}

Используйте этот код для проверки палиндромов. Вы усложняете свой код, передавая var validCharacters = 'abcdefghijklmnopqrstuvwxyz'.split(' '); Вы можете использовать re, как будто я должен включать все возможные комбинации, включая числа!

0 голосов
/ 05 августа 2020

lettersArr - это не то, что вы ожидаете.

Вы разделяете входную строку пробелами, что означает, что вы получаете ['taco', 'cat'], а не ['t', 'a', 'c', 'o', 'c', 'a', 't'].

Затем, когда эта строка запускается:

if (validCharacters.indexOf(char)> - 1) lettersArr.push(char);

char это 'taco', которого нет в validCharacters, поэтому ничего не помещается в lettersArr.

И поскольку lettersArr пуст :

lettersArr.join(' ') === lettersArr.reverse().join(' ');

превращается в:

[].join(' ') === [].reverse().join(' ')

Что, конечно, всегда верно.

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

 function isPalindrome(string){
  string = string.toLowerCase();
  var charactersArr = string.split('');
  var validCharacters = 'abcdefghijklmnopqrstuvwxyz'.split('');

  var lettersArr = [];
  charactersArr.forEach(char => {
    if (validCharacters.indexOf(char)> - 1) lettersArr.push(char);
  });
  return lettersArr.join(' ') === lettersArr.reverse().join(' ');
}

console.log("Taco Cat", isPalindrome("Taco Cat"));
console.log("abc", isPalindrome("abc"));
0 голосов
/ 05 августа 2020

Это потому, что lettersArr всегда пусто .... Попробуйте этот код:

function isPalindrome(string) {
  let reversed = string.toLowerCase().split('').reverse().join('');
  return reversed === string.toLowerCase()
}

let result1 = isPalindrome("Foo bar")
let result2 = isPalindrome("mom")

console.log(result1, result2)
0 голосов
/ 05 августа 2020

Он всегда возвращает true, потому что lettersArr всегда пусто. Попробуйте отладить свой код с помощью отладчика или просто используйте для этой цели console.log.

Я считаю, что, по крайней мере, эта строка var charactersArr = string.split(' '); не делает то, что ожидается: она разбивает предложение пробелами на слова вместо разбиение на отдельные буквы.

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