2016-03-30 2 views
1

Это мой код: Функция хорошо работает для входов: «глаз», «гоночный автомобиль», «не палиндром», «мужчина, план, канал «Панама», «никогда не странно или даже» ... Однако он возвращает «истина», когда вход «почти». Может кто-нибудь объяснить, почему?У меня возникли проблемы с функцией палиндрома в javascript

function palindrome(str) { 

    var newStr = str.replace(/[^0-9a-zA-Z]/g, ''); 
    newStr = newStr.replace(/\s+/g, ''); 
    newStr = newStr.toLowerCase(); 
    var arr = newStr.split(''); 
    var arr2 =[]; 

    for(x = 0; x < arr.length; x++){ 
    arr2.push(arr[arr.length-1-x]); 
    } 

    for(y = 0; y < arr.length; y++){ 
    if(arr[y] == arr2[y]){ 
     return true; 
    } 
    else{ 
     return false; 
    } 
    } 

} 

palindrome("almostomla"); 
+0

'' никогда нечетный или даже «' не палиндром! –

+0

извините, орфографическая ошибка. вход был «никогда нечетным или даже» – sallysway

+0

Ха-ха, ладно !!!! –

ответ

0

Я бы действительно заменить палиндром функции, как показано ниже проверки, после удаления шума:

function palindrome(str) { 
 
    var newStr = str.replace(/[^0-9a-zA-Z]/g, ''); 
 
    newStr = newStr.replace(/\s+/g, ''); 
 
    newStr = newStr.toLowerCase(); 
 
    var arr = newStr.split(''); 
 
    return arr.join('') == arr.reverse().join(''); 
 
} 
 

 
alert(palindrome("almostomla")); 
 
alert(palindrome("never odd or even"));

Работает как ожидается д.

Почему ваш старый код не работает?

Он проверяет только первую правильную вещь и возвращает true. Вы должны удалить return true оттуда. Ваш код , как только первый и последний символы совпадают, считайте его палиндром.

Так что ваш код, исправлена ​​форма будет:

function palindrome(str) { 
 

 
    var newStr = str.replace(/[^0-9a-zA-Z]/g, ''); 
 
    newStr = newStr.replace(/\s+/g, ''); 
 
    newStr = newStr.toLowerCase(); 
 
    var arr = newStr.split(''); 
 
    var arr2 = []; 
 

 
    for (var x = 0; x < arr.length; x++) { 
 
    arr2.push(arr[arr.length - 1 - x]); 
 
    } 
 

 
    for (var y = 0; y < arr.length; y++) { 
 
    debugger; 
 
    if (arr[y] != arr2[y]) { 
 
     return false; 
 
    } 
 
    } 
 
    return true; // Place it here to return after the whole loop. 
 
} 
 

 
alert(palindrome("almostomla")); 
 
alert(palindrome("never odd or even"));

+0

Почему бы не 'return newStr == newStr.split (''). Reverse(). Join ('');'? – AKS

+0

@AKS Это мой первый. –

0

Вы можете использовать более простую функцию, чтобы проверить, является ли слово палиндром:

function checkPalindrom(str) { 
    return str == str.split('').reverse().join(''); 
} 

checkPalindrom("almostomla"); // false 
+1

Это не работает для пространств и запятых. –

+1

Да, я знаю, что я мог бы написать это так. Спасибо! Однако мне хотелось бы знать, почему моя предыдущая версия не работает :) – sallysway

+0

Я думаю, что можно предположить, что OP позаботится об этом перед сравнением. Что предлагает @Carlos - это идея, над которой OP может работать. – AKS

0

Почему бы не просто сделать это:

function palindrome(str) { 

    var isPalindrome = true; 
    var newStr = str.replace(/[^0-9a-zA-Z]/g, ''); 
    newStr = newStr.replace(/\s+/g, ''); 
    newStr = newStr.toLowerCase(); 
    var arr = newStr.split(''); 

    for(x = 0; x < arr.length/2; x++) { 
     if(arr[x] != arr[arr.length - 1 - x]) 
     { 
      isPalindrome = false; 
      break; 
     } 
    }  

    return isPalindrome; 
} 
0

Вы возвращаетесь только после сравнения первой записи:

for(y = 0; y < arr.length; y++){ 
    if(arr[y] == arr2[y]){ 
     return true; // here you are returning 
    } 
    else{ 
     return false; 
    } 
    } 

Так что в случае almostomla первый элемент как arr, так и arr2 - a, потому что строка начинается и заканчивается a.

Вы можете сделать это так, чтобы проверить первую запись, которая не соответствует:

var flag = true; 

    for(y = 0; y < arr.length; y++){ 
    if(arr[y] != arr2[y]){ 
     flag= false; 
     break; 
    } 
    } 

return flag; 
1

Вы только проверяете первые и последние символы в вашем последнем цикл.

for(y = 0; y < arr.length; y++){ 
    if(arr[y] == arr2[y]){ //if first and last chars equal you are returning true. 
     return true; 
    } 
    else{ 
     return false; 
    } 
} 

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

for(y = 0; y < arr.length; y++){ 
    if(arr[y] != arr2[y]){ 
     return false; 
    } 
} 

return true; --that means two arrays are same. 
+0

Да, вы правы. Спасибо, что указали мою ошибку. Приветствия :) – sallysway

0

Вы сравниваете первое и последнее письмо. Если они совпадают, тогда код возвращает «True», не проверяя другие буквы в строке. Сравнение должно продолжаться, даже если первая итерация цикла дает «True»!

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