2015-11-11 6 views
-1

Я заметил, что когда я буквально набираю слово test или dabd, он терпит неудачу, говоря «тест - это палиндром»; очевидно, это должно потерпеть неудачу. Я тестирую другие слова, такие как гоночный автомобиль, мадам, кошка, все они проходят. Я проверяю слева и справа персонажа и спускаюсь вниз, пока мы не достигнем середины. В чем может быть проблема?Неудачный тест для палиндрома JavaScript

function lengthChecker() { 
    var str = document.getElementById("str").value; 
    if (str.length > 10) { 
     alert("Sorry. Your input surpasses the 10 characters maximum. Please try again.") 
     return false; 
    } else if (str.length == 0) { 
     alert("Sorry. Your input is too short, and doesn't meet the 10 characters maximum. Please try again.") 
     return false; 
    } 
    palindrome(str); 
} 

function palindrome(str) { 
    var j = str.length; 
    if (/\s/.test(str)) { 
     alert("No spaces allowed.") 
     return false; 
    } 
    for (i = 0; i < j/2; i++) { 
     if (str[i] == str[j - 1 - i]) { 
      isPalindrome('', str); 
      return true; 
     } else { 
      notPalindrome(str); 
      return false; 
     } 
    } 
} 

function isPalindrome(e, str) { 
    alert(str + " is a Palindrome."); 
} 

function notPalindrome(str) { 
    alert(str + " isn't a Palindrome"); 
} 

document.addEventListener("DOMContentLoaded", function(e) { 
    var el = document.getElementById("checkInput"); 
    el.addEventListener("click", lengthChecker); 
}); 
+0

В 'palindrome()' вы всегда проверяете только первый символ и сразу возвращаетесь. – Nayuki

+0

Кроме того, * lengthChecker * должен возвращать возвращаемое ему значение из * palindrome *. – RobG

+0

Что вы имеете в виду? – user1776479

ответ

1

В palindrome() вы всегда проверяете только первый символ и немедленно возвращаетесь. Зафиксируйте петлю следующим образом:

for (var i = 0; i < j/2; i++) { 
     if (str[i] != str[j - 1 - i]) { 
      notPalindrome(str); 
      return false; 
     } 
    } 
    isPalindrome('', str); 
    return true; 
0

Для справки вам не нужно зацикливать. Вы можете упростить тест палиндром только это:

str === str.split('').reverse().join('') 

Это разбивает строку на массив, который затем можно повернуть вспять. Затем он присоединяет его обратно к строке, чтобы вы могли сравнить ее.

я тогда положил это в тройном заявлении для изменения сообщения:

var notp = (str === '' || str !== str.split('').reverse().join('').replace(" ", "")) ? 'is NOT':'IS'; 

Я добавил «ул ===„“», чтобы проверить, не являющиеся записи, и я добавил тест удалить пробела также. Теперь у вас есть переменная, которую вы можете ввести в общий оповещение или что угодно. Вы можете изменить это, чтобы читать «true: false»; вместо этого вы хотите контролировать больше, чем просто текст сообщения.

Следующие избавляется от передних и задних пространств:

str = str.trim(); 

Есть еще изменения, которые Вы можете сделать, но это должно помочь вам в этом. Вот jsfiddle: https://jsfiddle.net/mckinleymedia/fudLdx0r/

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