我的回文有什么问题? (javascript)

Whats wrong with my palindrome? (javascript)

我写了这个回文的js代码,我知道网上有更好更高效的回文方法,但我想知道为什么我的回文功能无法正常工作?

代码:

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

输出:

palindrome
not palindrome

你真的不需要嵌套循环,你可以通过字符串向后循环来反转字符串,然后将它与原始字符串进行比较。我更新了代码段以供使用。

之前,您的代码不是反转字符串,而是只是遍历字符并将它们分配给 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');

试试下面的代码。它的工作原理是将字符串长度除以 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"));

内循环完全没有必要。它每次都做同样的事情——它循环遍历整个字符串,从末尾开始,重复设置 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');

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

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

指针应该像这样移动 -

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