2016-03-30 41 views
1

这是我的代码: 该函数适用于输入:“眼睛”,“赛车”,“不是回文”,“男人,计划,运河。巴拿马“,”从不奇怪甚至是......“ 然而,当输入是”almostomla“时,它返回”true“。有人可以解释为什么吗?我在回文中使用回文功能时遇到问题

function palindrome(str) { 

    var newStr = str.replace(/[^0-9a-zA-Z]/g, ''); 
    newStr = newStr.replace(/\s+/g, ''); 
    newStr = newStr.toLowerCase(); 
    var arr = newStr.split(''); 
    var arr2 =[]; 

    for(x = 0; x < arr.length; x++){ 
    arr2.push(arr[arr.length-1-x]); 
    } 

    for(y = 0; y < arr.length; y++){ 
    if(arr[y] == arr2[y]){ 
     return true; 
    } 
    else{ 
     return false; 
    } 
    } 

} 

palindrome("almostomla"); 
+0

''不是奇数或偶数''不是回文! –

+0

对不起,拼写错误。输入是“从不奇怪或甚至” – sallysway

+0

哈哈,好吧! –

回答

0

我真的会取代回文检查类似下面的功能,去除噪声后:

function palindrome(str) { 
 
    var newStr = str.replace(/[^0-9a-zA-Z]/g, ''); 
 
    newStr = newStr.replace(/\s+/g, ''); 
 
    newStr = newStr.toLowerCase(); 
 
    var arr = newStr.split(''); 
 
    return arr.join('') == arr.reverse().join(''); 
 
} 
 

 
alert(palindrome("almostomla")); 
 
alert(palindrome("never odd or even"));

作为期望的工作d。

为什么你的旧代码不工作?

它只检查第一个正确的东西,并返回true。您应该从那里删除return true。第一个和最后一个字符相同时,您的代码是,请将其视为回文

所以你的代码,经校正的形式将是:

function palindrome(str) { 
 

 
    var newStr = str.replace(/[^0-9a-zA-Z]/g, ''); 
 
    newStr = newStr.replace(/\s+/g, ''); 
 
    newStr = newStr.toLowerCase(); 
 
    var arr = newStr.split(''); 
 
    var arr2 = []; 
 

 
    for (var x = 0; x < arr.length; x++) { 
 
    arr2.push(arr[arr.length - 1 - x]); 
 
    } 
 

 
    for (var y = 0; y < arr.length; y++) { 
 
    debugger; 
 
    if (arr[y] != arr2[y]) { 
 
     return false; 
 
    } 
 
    } 
 
    return true; // Place it here to return after the whole loop. 
 
} 
 

 
alert(palindrome("almostomla")); 
 
alert(palindrome("never odd or even"));

+0

为什么不''return newStr == newStr.split('')。reverse()。join('');'? – AKS

+0

@AKS这是我的第一个。 –

0

您可以使用一个简单的函数来检查,如果一个词是回文:

function checkPalindrom(str) { 
    return str == str.split('').reverse().join(''); 
} 

checkPalindrom("almostomla"); // false 
+1

这不适用于空间和逗号提供的东西。 –

+1

是的,我知道我可以这样写。谢谢!然而,我想知道为什么我的以前的版本不工作:) – sallysway

+0

我认为可以假设OP会在比较之前处理它。 @Carlos提供的是OP可以在其上工作的想法。 – AKS

0

为什么就不能做到这一点:

function palindrome(str) { 

    var isPalindrome = true; 
    var newStr = str.replace(/[^0-9a-zA-Z]/g, ''); 
    newStr = newStr.replace(/\s+/g, ''); 
    newStr = newStr.toLowerCase(); 
    var arr = newStr.split(''); 

    for(x = 0; x < arr.length/2; x++) { 
     if(arr[x] != arr[arr.length - 1 - x]) 
     { 
      isPalindrome = false; 
      break; 
     } 
    }  

    return isPalindrome; 
} 
0

你只返回的第一个条目比较后:

for(y = 0; y < arr.length; y++){ 
    if(arr[y] == arr2[y]){ 
     return true; // here you are returning 
    } 
    else{ 
     return false; 
    } 
    } 

因此,在almostomla的情况下,arrarr2的第一个元素是a,因为字符串以a开头和结尾。

你可以做这样的检查不匹配的第一个条目:

var flag = true; 

    for(y = 0; y < arr.length; y++){ 
    if(arr[y] != arr2[y]){ 
     flag= false; 
     break; 
    } 
    } 

return flag; 
1

你只检查您的倒数第一和最后一个字符的循环。

for(y = 0; y < arr.length; y++){ 
    if(arr[y] == arr2[y]){ //if first and last chars equal you are returning true. 
     return true; 
    } 
    else{ 
     return false; 
    } 
} 

您应该检查所有字符,直到有差异或结束。

for(y = 0; y < arr.length; y++){ 
    if(arr[y] != arr2[y]){ 
     return false; 
    } 
} 

return true; --that means two arrays are same. 
+0

是的,你是对的。感谢您指出我的错误。干杯:) – sallysway

0

比较第一个和最后一个字母。如果它们相同,则代码将返回“True”而不检查字符串中的其他字母。即使循环的第一次迭代产生“真”,比较应该继续!

相关问题