我的回文错了吗? (JavaScript的)

时间:2017-06-22 22:56:38

标签: javascript palindrome

我已经为回文编写了这个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

4 个答案:

答案 0 :(得分: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'));

答案 1 :(得分: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"));

答案 2 :(得分: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');

答案 3 :(得分: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');