简体   繁体   English

为什么我的回文代码在每种情况下都运行正确?

[英]Why is my Palindrome code running true for every scenario?

This code returns true for every scenario;此代码对每个场景都返回 true; it returns true if it's a palindrome and it returns true if it's not a palindrome.如果是回文则返回真,如果不是回文则返回真。

 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");
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;
}

Use this code for checking palindromes.使用此代码检查回文。 You are complicating your code by passing in var validCharacters = 'abcdefghijklmnopqrstuvwxyz'.split(' ');您通过传入var validCharacters = 'abcdefghijklmnopqrstuvwxyz'.split(' ');使代码复杂化You could use re like I have to include all possible combinations including numbers !你可以使用re就像我必须包括所有可能的组合,包括数字!

It always returns true because lettersArr is always empty.它始终返回true ,因为lettersArr始终为空。 Try to debug your code using debugger or just use console.log for this purpose.尝试使用调试器调试您的代码,或者为此目的仅使用console.log

I believe at least this line var charactersArr = string.split(' ');我至少相信这一行var charactersArr = string.split(' '); is not doing what is expected: it splits a sentence by space characters into words instead of splitting into separate letters.没有做预期的事情:它通过空格字符将句子拆分为单词,而不是拆分为单独的字母。

It's because lettersArr is always empty.... Try this code:这是因为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)

lettersArr is not what you expect. lettersArr不是您所期望的。

You are splitting the input string by spaces, which means you get ['taco', 'cat'] and not ['t', 'a', 'c', 'o', 'c', 'a', 't'] .你用空格分割输入字符串,这意味着你得到['taco', 'cat']而不是['t', 'a', 'c', 'o', 'c', 'a', 't']

Then when this line runs:然后当这条线运行时:

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

char is 'taco' which isn't found in validCharacters , so nothing gets pushed into lettersArr . char是在validCharacters中找不到'taco' ,因此没有任何内容被推入lettersArr

And since lettersArr is empty:而且由于lettersArr是空的:

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

Becomes:变成:

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

Which, of course, it always true.当然,这总是正确的。


To fix it you simply want to split the string by an empty string, which gives you array of single character strings.要修复它,您只需要将字符串拆分为一个空字符串,这将为您提供单个字符串的数组。

 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"));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM