2013-09-23 3 views
2

Это код, который я использовал для вызова coderbyte «Palindrome». Задача состоит в том, чтобы вернуть true, если str является тем же самым фоном и назад (палиндром). У меня есть все возможные моменты, но я знаю, что мой код немного уродлив. Что было бы более эффективным способом написания этого кода. Похоже, я повторяю себя, и это похоже на то, что может быть написано с помощью цикла for. Я также вижу, как он может вернуть true, когда он действительно неверен, если был более длинный палиндром без использования цикла 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()));   
+0

Первый шаг: исправьте углубление, чтобы было ясно, что происходит. –

+0

Я не знаю, как вы получили больше, чем несколько очков с этим кодом, кажется, что тесты недостаточно полны. Код работает только для палиндромов, содержащих до пяти символов. Вам нужно проверить всю строку, а не только первые два и два последних символа. – Guffa

ответ

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
function Palindrome(str) { 
    str = str.toLowerCase(); 
    str = str.split(" ").join(""); 
    return str == str.split("").reverse().join(""); 
} 

Это то, что я закончил с. Убедитесь, что строка была строчной, поэтому она не будет читать потенциально истинный параметр как false, избавиться от пробелов и затем вернет true/false, исходя из того, была ли строка равной обратному.

+0

Если тестовый файл содержит другие специальные символы, такие как тире, это все равно не удастся. Вы можете написать метод «replace» для удаления других символов, которые не являются буквами: «str = str.replace (/ \ s \ - \ '/ g,' ');' вместо 'str = str .split ("") .join (""); '. – Xufox

+0

Ах имеет смысл, спасибо! – Alex

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

} 

код начинающий дружелюбный и сам объяснительный, но если у вас есть какие-либо вопросы относительно кода, не стесняйтесь спросить ;)

Смежные вопросы