2017-06-22 65 views
2

我已经为回文写了这个js代码,我知道在线有更好更高效的回文方法,但我想知道为什么我无法让我的回文函数正常工作?我的回文文件有什么问题? (javascript)

CODE:

var pal = function(str) { 
 

 
    var len = str.length; 
 

 
    for (var i = 0; i < len; i++) { 
 
    var comp1 = str.substring(i, i + 1); 
 

 
    for (var j = len; j > 0; j--) { 
 
     var comp2 = str.substring(j - 1, j); 
 
    } 
 

 
    if (comp1 != comp2) { 
 
     console.log("not palindrome") 
 
     break; 
 
    } else { 
 
     console.log('palindrome') 
 
    } 
 
    } 
 
} 
 

 
pal('maddog');

OUTPUT:

palindrome 
not palindrome 
+1

你觉得内环呢?它总是将'comp2'设置为字符串的第一个字母。 – Barmar

回答

2

有很多更好的算法来检查回文。让我们使用您正在使用的相似算法。

我们基本上使用两个指针 - 左和右,同时移动到中间。在原始问题中,左指针和右指针不会同时移动。

指针应移动这样的 -

a b c b a 
^  ^

a b c b a 
^^

a b c b a 
    ^

var isPalindrome = function (str) { 
 
    for (var i = 0, j = str.length-1; i < j; i++ , j--) { 
 
     if (str[i] != str[j]) { 
 
      return false; 
 
     } 
 
    } 
 
    return true; 
 
} 
 

 
console.log('maddog : ' + isPalindrome('maddog')); 
 
console.log('abcba : ' + isPalindrome('abcba')); 
 
console.log('deed : ' + isPalindrome('deed')); 
 
console.log('a : ' + isPalindrome('a'));

+0

感谢您的好解释!学到了很多! –

0

你并不真的需要嵌套的循环,你可以向后通过串回路反转字符串然后将它与原始字符串进行比较。我更新了Snippet的工作。

之前,您的代码并未反转字符串,而只是遍历字符并将它们分配给comp1comp1变量。您需要在连接字符串,以建立新的字符串向后comp = comp + str.substring(j-1, j);

var pal = function(str) { 
 

 
    var len = str.length; 
 
    var comp = ''; 
 

 
    for (var j = len; j > 0; j--) { 
 
    comp = comp + str.substring(j - 1, j); 
 
    } 
 

 
    if (str !== comp) { 
 
    console.log("not palindrome") 
 
    return; 
 
    } 
 
    
 
    console.log('palindrome') 
 
} 
 

 
pal('arepera');

+0

尝试使用回文一个 –

+1

您突出显示的“错误”一般都不是错误,然后它们不是OP发布的代码无法正常工作的原因 – quirimmo

+0

“*您必须在范围外声明comp2变量for循环*“。用* var *声明的变量具有函数作用域,所以这不是问题。您的更改不会以任何有意义的方式影响代码。 – RobG

1

试试下面的代码。它的工作原理通过将串长度是2,然后迭代时,检查镜像角色彼此:

var pal = function(str){ 
 
    var len = str.length; 
 
    for(var i = 0; i < Math.floor(len/2); i++){ 
 
     if(str[i] != str[(len-1)-i]){ 
 
      return false; 
 
     } 
 
    } 
 
    return true; 
 
} 
 

 
console.log(pal("bunny")); 
 
console.log(pal("amoreroma"));

+0

如果你要改变方法,你可以全力以赴和'return str === str.split(“”)。reverse()。join(“”);' – mhodges

0

内环是完全不必要的。它每次都做同样的事情 - 它从最后开始遍历整个字符串,反复将comp2设置为字符;当它完成时,comp2总是包含第一个字符。所以你的函数只是测试字符串中的每个字符是否与第一个字符相同。

要测试某个回文是否是某个东西,需要将每个字符与字符串另一端的相应字符进行比较。这不需要两个循环。你也只需要遍历字符串的前半部分,而不是整个字符串。

最后,您应该只在回路末尾回显Palindrome。在循环内,你只知道一个字符匹配,而不是全部匹配。

var pal = function(str) { 
 

 
    var len = str.length; 
 
    var half = Math.floor(len/2); 
 
    var isPal = true; 
 

 
    for (var i = 0; i < half; i++) { 
 
    var comp1 = str[i]; 
 
    var comp2 = str[len - i - 1]; 
 

 
    if (comp1 != comp2) { 
 
     console.log("not palindrome") 
 
     isPal = false; 
 
     break; 
 
    } 
 
    } 
 
    if (isPal) { 
 
    console.log('palindrome') 
 
    } 
 
} 
 

 
pal('maddog'); 
 
pal('maddam');