2

这是我用于 coderbyte 挑战“Palindrome”的代码。如果 str 是相同的正向和反向(回文),挑战是返回 true。我得到了所有可能的分数,但我知道我的代码有点难看。编写此代码的更有效方法是什么。看起来我在重复自己,似乎可以用 for 循环编写一些东西。我还看到如果在不使用 for 循环的情况下有更长的回文,当它真的为假时它如何返回真:

function Palindrome(str) { 
    var low=str.toLowerCase()
    var first = low.charAt(0);
    var last = low.charAt(low.length-1);
    var mid = low.charAt(1);
    var mid1 = low.charAt(low.length-2);


       if(first===last)
        if(mid===mid1)


        {
           return true    
        }
            else
        {
            return false    
        }
        else
        {
            return false
        }
        }
print(Palindrome(readline()));           
4

4 回答 4

1
function Palindrome(str) { 
    str = str.toLowerCase();
    str = str.split(" ").join("");
    return str == str.split("").reverse().join("");
}

这就是我最终的结果。确保字符串都是小写的,这样它就不会将潜在的真参数读为假,去掉空格,然后根据字符串是否等于它的反转返回真/假。

于 2015-04-01T21:31:55.733 回答
1

要检查字符串是否是回文,您只需将其与其反转版本进行比较。
说这个词hello不是回文,因为它的颠倒版本olleh不等于它。但是这个词eye是一个与词相同的回文,abba因为它们等于它们的反转版本。

代码示例:

(function() {
    var reverseStr,
        isPalindrome,
        testStrings;

    reverseStr = function(str) {
        var chars = [];
        for(var i = str.length - 1; i > -1; i--) {
            chars.push(str[i]);
        }
        return chars.join('');
    };

    isPalindrome = function(str, ignoreCase) {
        if(ignoreCase) {
            str = str.toLowerCase();
        }
        return str === reverseStr(str);
    };

    testStrings = ['abba', 'hello', 'eye'];

    for(var i = 0, l = testStrings.length; i < l; i++) {
        var word = testStrings[i];
        console.log('Word "%s" is %sa palindrome',
            word,
            isPalindrome(word) ? '' : 'not ');
    }
})();

演示#1

下面列出了另一种可以更快工作的方法。在这里,您不会收到要比较的反转字符串,而是从字符串的开头和结尾走向字符串的中间。

var isPalindrome = function(str, ignoreCase) {
    var length,
        last,
        halfLength,
        i;
    if(ignoreCase) {
        str = str.toLowerCase();
    }
    length = str.length;
    last = length - 1;
    halfLength = Math.ceil(length / 2);
    for(i = 0; i < halfLength; i++) {
        if(str[i] !== str[last - i]) {
            return false;
        }
    }
    return true;
};

演示#2

于 2013-09-23T22:46:29.987 回答
0

我遇到了这个回文编码挑战,您必须替换所有非字母数字字符(标点符号、空格和符号),当然还要将字符串更改为小写。这是我的解决方案。

 function palindrome(str) {

  var low = str.toLowerCase(); 
  var filteredStr = low.replace(/[^0-9a-z]/gi, "");  
  var split = filteredStr.split("");
  var backward = split.reverse();
  var join = backward.join("");


  if (filteredStr === join) {
    return true;
  } else {
    return false;
  }

}

如果您关心代码行数,这里是较小的

 function palindrome(str) {

  var low = str.toLowerCase(); 
  var filteredStr = low.replace(/[^0-9a-z]/gi, "");  
  var backward = filteredStr.split("").reverse().join("");


  if (filteredStr === backward) {
    return true;
  } else {
    return false;
  }

}

该代码对初学者友好且一目了然,但如果您对代码有任何疑问,请随时提出;)

于 2016-07-19T16:39:22.333 回答
0

这是一个更简单的方法:

var isPalindrome = function(string) {
    string = string.toLowerCase();
    if(string.length===0){
    return false;
    }
    for (var i = 0; i < Math.ceil(string.length/2); i++) {
        var j = string.length-1-i;
        var character1 = string.charAt(i);
        var character2 = string.charAt(j);
        if (character1 !== character2) {
            return false;
        }
    }
    return true;
};
于 2016-02-23T22:08:25.777 回答