2016-09-27 39 views
0

我写了这段代码一个练习的一部分来检查天气或不是一个字符串是palindromes。他们的程序在检查字符串方面工作正常,但当字符串不是回文时它不返回错误。我究竟做错了什么?感谢JavaScript程序来检查一个字符串是否回文假回复

//convert the string to array 
var stringArr = [ ]; 
var bool; 
function palindrome(str) { 
    // make lowercase 
    var lowerCase = str.toLowerCase(); 
    //remove numbers, special characters, and white spaces 
    var noNumbers = lowerCase.replace(/[0-9]/g, ''); 
    var noSpecials = noNumbers.replace(/\W+/g, " "); 
    var finalString = noSpecials.replace(/\s/g, ''); 
    stringArr = finalString.split(""); 

    if (stringArr.sort(frontToBack)==stringArr.sort(backToFront)) { 
     bool = true; 
    } 
    else { 
     bool= false; 

    } 
    return bool; 
} 
function frontToBack (a,b) {return a-b;} 
function backToFront (a,b) {return b-a;} 

palindrome("eye"); 
+1

我认为这个问题更适合代码审查? http://codereview.stackexchange.com/ –

回答

0

这是因为串减法产量NaN,这意味着这两个排序数组是原来一样。

即使您确实转换为ASCII编码,您也会对整个字符串进行排序,然后例如字符串abba将从前到后排序为aabb,并且回到前面为bbaa。 (编辑:,也什么卡尔写了sort改变原有的阵列仍 - 排序是在这里不走的路)

你应该做的刚好相反的字符串(阵列上使用reverse)和比较。

1

if (stringArr.sort(frontToBack)==stringArr.sort(backToFront)) {是你的问题。

在JavaScript中,sort方法会更新您正在排序的变量的值。所以在你的比较中,一旦两种排序都运行完毕,两者都会得到相同的值(因为第二种排序有效地覆盖了第一排)。

例如。

var a = [1,7,3]; 
a.sort(); 
console.log(a); // will print 1,3,7 

编辑:有一个快速测试,我认为eavidan的建议可能是最好的。

EDIT2:只是把一个希望工作回文功能:)的快速版本

function palindrome(str) { return str.split("").reverse().join("") == str;} 
+0

感谢这有帮助!我的解决方案仍然不适用于这两种情况:第一:回文(“_ eye”)应该返回true。 SECOND:回文(“1只眼的1只眼睛”)应该返回假 – dadadodo

+0

地雷真的只是一个样本,加入你的小型化和不需要的角色剥离,它应该做你的事后:) – Carl

0

你可能会做如下;

var isPalindrome = s => { var t = s.toLowerCase() 
 
            .replace(/\s+/g,""); 
 
          return [].slice.call(t) 
 
            .reverse() 
 
            .every((b,i) => b === t[i]); 
 
         }; 
 

 
console.log(isPalindrome("Was it a car or a cat I saw")); 
 
console.log(isPalindrome("This is not a palindrome"));

相关问题