2017-08-18 268 views
0

我试图设置一个函数来检查单词或文本是否是回文。要做到这一点,它会分割文本,以便每个字母都是新数组的一个元素,它将除去空白并使其成为反转数组。 然后它检查两个数组中相同位置上的每个元素是否相等。如果不是,则返回false,如果是,则返回true。 这里的功能:比较两个数组之间的值

function palindrome(str) { 
 
    var low = str.toLowerCase(); 
 
    var newArray = low.split(""); 
 
    var noSpace = newArray.filter(function(val) { 
 
    return val !== " "; 
 
    }); 
 
    var reverse = noSpace.reverse(); 
 
    
 
    function check (a, b) { 
 
    console.log(`checking '${a}' against '${b}'`); 
 
    var partial; 
 
    var result = 1; 
 
    for (var i = 0; i < a.length; i++) { 
 
     console.log(`comparing '${a[i]}' and '${b[i]}'`); 
 
     if (a[i] !== b[i]) { 
 
     result = 0; 
 
     } else { 
 
     partial = 1; 
 
     result *= partial; 
 
     } 
 
    } 
 
    return result; 
 
    } 
 
    
 
    var result = check(noSpace, reverse); 
 
    if (result == 1) { 
 
    return true; 
 
    } else { 
 
    return false; 
 
    } 
 
    
 
    
 
} 
 

 

 
palindrome("r y e");

我不知道什么是错的,但似乎功能不断不管我传递给函数什么词或文本返回真值。那有什么问题?

+1

您可能需要使用你正在使用以及语言名称标记。 –

+1

您可能想要正确缩进代码。为了调试你的代码,用调试器逐行浏览它,随时检查变量。 –

+1

请仔细阅读“reverse”的文档。 –

回答

3

你的问题似乎是因为reverse()也改变了实际的数组。这样做

var reverse = noSpace.reverse(); 

将扭转noSpace和变量reverse分配给它的参考。也就是说,两个数组将是相同的(反向)数组。

为了避免这种情况,我使用原始数组的.slice()create a copy,然后在该新数组上调用.reverse(),消除了任何冲突。

下面是什么它看起来像一个工作片断:

function palindrome(str) { 
 
    var str_array = str.toLowerCase().split(""); 
 
    var no_space = str_array.filter(function(val) { 
 
     return val !== " "; 
 
    }); 
 

 
    // By applying '.slice()', we create a new array 
 
    // reference which can then be reversed and assigned 
 
    // to the 'reverse' variable 
 
    var reverse = no_space.slice().reverse(); 
 

 
    function check(a, b) { 
 
     var partial; 
 
     var result = 1; 
 
     for(var i=0; i < a.length; i++) { 
 
      if(a[i] !== b[i]) { 
 
       // We don't need to keep 
 
       // comparing the two, it 
 
       // already failed 
 
       return 0; 
 
      } else { 
 
       // I've kept this part even though 
 
       // I don't really know what it is 
 
       // intended for 
 
       partial = 1; 
 
       result *= partial; 
 
      } 
 
     } 
 
     return result; 
 
    } 
 
    return check(no_space, reverse) === 1; 
 
} 
 

 
console.log(palindrome("a b a")); 
 
console.log(palindrome("r y e"));

+0

看起来像reverse()是搞乱我的代码的。 slice()似乎是一个很好的解决方案。我没有收到'return check(no_space,reverse)=== 1;'在回文功能的末尾。你能解释我吗? – Dema

+1

'check()'函数将返回一个值(0或1)。我们希望'palindrome()'函数返回“true”或“false”。为了做到这一点,我们需要将check()返回的值与0或1进行比较(本例中为1)。所以如果check()返回1,我们得到'1 === 1'(这是'true')。如果check()返回0,我们得到'0 === 1'(这是'false')。因而,我们有'回文()''返回或TRUE''FALSE'取决于'检查的返回值()'函数 –

+1

或者,你可以做'如果(检查(no_space,反向)=== 1 ){return true; } else {return false; }'。它们的工作原理完全相同,只是代码大小问题 –

0

result *= partial;1 * 1永远等于1

+1

但是,如果'result'由于不匹配而被设置为'0',它将保持为'0'。 –

+0

@torazaburo是的,你的意思是表达'.reverse()'是问题吗?你为什么不发表答复? – guest271314

+1

我希望for循环比较两个数组的所有值,所以我想我可以创建一个变量来存储所有比较的结果。 1与布尔值相同,所以我想我可以使用它。 – Dema

0

我没纠正你的代码,但在这里是为您优化的解决方案。

function palindrom(string) { 
    var arr = string.split(""); 

    var lengthToCheck = Math.floor(arr.length/2); 
    for (var i = 0; i < lengthToCheck; i++) { 
     if (arr[i] != arr[arr.length - (1 + i)]) { 
      return false; 
     } 
    } 

    return true; 
} 

首先我在传递的字符串的每个字符之后分割数组。之后,我得到阵列长度的一半,因为它足以检查一半。 随着循环我比较上半年和下半年。只要我找到两个不匹配的字符,我就会返回false。如果整个前半部分与数组的后半部分匹配,则for循环将完成,然后返回true。

+2

他/她没有要求新的实施。世界上有一百万回文实现。他/他问为什么发布的代码不起作用。 –

0

什么是实际发生的事情是.reverse()在当前位置倒转数组,它然后存储到数组,是不是有什么参考你打电话给你的check()方法。

简单的解决方法是改变你的if语句:

if (a[i] !== b.reverse()[i]) 
+0

虽然每次迭代都不会反转'b'吗? –

+0

这根本不起作用。 –

+0

@torazaburo https://jsfiddle.net/x62oqq6v/ - 在这里工作,对不起让人失望! – Ricktron3000

1

已编码回文的方式是太复杂了。

但是,您的代码有一个问题:当您执行reverse()时,它也会更改原始数组。

所以你需要确保你通过slice()复制它。

您也可以直接发送一个布尔结果,而不是做一个10