更高效的回文代码

时间:2013-09-23 22:04:37

标签: javascript dry performance palindrome

这是我用于coderbyte挑战“Palindrome”的代码。如果str是相同的向前和向后(回文),则挑战是返回true。我得到了所有可能的积分,但我知道我的代码有点难看。什么是更有效的编写此代码的方法。看起来我正在重复自己,它似乎可以用for循环编写。我也看到如果没有使用for循环,如果有更长的回文,它真的是假的,它会如何返回true:

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 个答案:

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

DEMO #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;
};

DEMO #2

答案 1 :(得分:1)

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

这就是我最终的结果。确保字符串全部为小写,因此它不会将可能的真实参数读为false,除去空格,然后根据字符串是否等于它反向返回true / false

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

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

}

代码是初学友好和自我解释,但如果您对代码有任何疑问,请随时提问;)