2017-08-18 459 views
0

我試圖設置一個函數來檢查單詞或文本是否是迴文。要做到這一點,它會分割文本,以便每個字母都是新數組的一個元素,它將除去空白並使其成爲反轉數組。 然後它檢查兩個數組中相同位置上的每個元素是否相等。如果不是,則返回false,如果是,則返回true。 這裏的功能:比較兩個數組之間的值

function palindrome(str) { 
 
    var low = str.toLowerCase(); 
 
    var newArray = low.split(""); 
 
    var noSpace = newArray.filter(function(val) { 
 
    return val !== " "; 
 
    }); 
 
    var reverse = noSpace.reverse(); 
 
    
 
    function check (a, b) { 
 
    console.log(`checking '${a}' against '${b}'`); 
 
    var partial; 
 
    var result = 1; 
 
    for (var i = 0; i < a.length; i++) { 
 
     console.log(`comparing '${a[i]}' and '${b[i]}'`); 
 
     if (a[i] !== b[i]) { 
 
     result = 0; 
 
     } else { 
 
     partial = 1; 
 
     result *= partial; 
 
     } 
 
    } 
 
    return result; 
 
    } 
 
    
 
    var result = check(noSpace, reverse); 
 
    if (result == 1) { 
 
    return true; 
 
    } else { 
 
    return false; 
 
    } 
 
    
 
    
 
} 
 

 

 
palindrome("r y e");

我不知道什麼是錯的,但似乎功能不斷不管我傳遞給函數什麼詞或文本返回真值。那有什麼問題?

+1

您可能需要使用你正在使用以及語言名稱標記。 –

+1

您可能想要正確縮進代碼。爲了調試你的代碼,用調試器逐行瀏覽它,隨時檢查變量。 –

+1

請仔細閱讀「reverse」的文檔。 –

回答

3

你的問題似乎是因爲reverse()也改變了實際的數組。這樣做

var reverse = noSpace.reverse(); 

將扭轉noSpace和變量reverse分配給它的參考。也就是說,兩個數組將是相同的(反向)數組。

爲了避免這種情況,我使用原始數組的.slice()create a copy,然後在該新數組上調用.reverse(),消除了任何衝突。

下面是什麼它看起來像一個工作片斷:

function palindrome(str) { 
 
    var str_array = str.toLowerCase().split(""); 
 
    var no_space = str_array.filter(function(val) { 
 
     return val !== " "; 
 
    }); 
 

 
    // By applying '.slice()', we create a new array 
 
    // reference which can then be reversed and assigned 
 
    // to the 'reverse' variable 
 
    var reverse = no_space.slice().reverse(); 
 

 
    function check(a, b) { 
 
     var partial; 
 
     var result = 1; 
 
     for(var i=0; i < a.length; i++) { 
 
      if(a[i] !== b[i]) { 
 
       // We don't need to keep 
 
       // comparing the two, it 
 
       // already failed 
 
       return 0; 
 
      } else { 
 
       // I've kept this part even though 
 
       // I don't really know what it is 
 
       // intended for 
 
       partial = 1; 
 
       result *= partial; 
 
      } 
 
     } 
 
     return result; 
 
    } 
 
    return check(no_space, reverse) === 1; 
 
} 
 

 
console.log(palindrome("a b a")); 
 
console.log(palindrome("r y e"));

+0

看起來像reverse()是搞亂我的代碼的。 slice()似乎是一個很好的解決方案。我沒有收到'return check(no_space,reverse)=== 1;'在迴文功能的末尾。你能解釋我嗎? – Dema

+1

'check()'函數將返回一個值(0或1)。我們希望'palindrome()'函數返回「true」或「false」。爲了做到這一點,我們需要將check()返回的值與0或1進行比較(本例中爲1)。所以如果check()返回1,我們得到'1 === 1'(這是'true')。如果check()返回0,我們得到'0 === 1'(這是'false')。因而,我們有'迴文()''返回或TRUE''FALSE'取決於'檢查的返回值()'函數 –

+1

或者,你可以做'如果(檢查(no_space,反向)=== 1 ){return true; } else {return false; }'。它們的工作原理完全相同,只是代碼大小問題 –

0

result *= partial;1 * 1永遠等於1

+1

但是,如果'result'由於不匹配而被設置爲'0',它將保持爲'0'。 –

+0

@torazaburo是的,你的意思是表達'.reverse()'是問題嗎?你爲什麼不發表答覆? – guest271314

+1

我希望for循環比較兩個數組的所有值,所以我想我可以創建一個變量來存儲所有比較的結果。 1與布爾值相同,所以我想我可以使用它。 – Dema

0

我沒糾正你的代碼,但在這裏是爲您優化的解決方案。

function palindrom(string) { 
    var arr = string.split(""); 

    var lengthToCheck = Math.floor(arr.length/2); 
    for (var i = 0; i < lengthToCheck; i++) { 
     if (arr[i] != arr[arr.length - (1 + i)]) { 
      return false; 
     } 
    } 

    return true; 
} 

首先我在傳遞的字符串的每個字符之後分割數組。之後,我得到陣列長度的一半,因爲它足以檢查一半。 隨着循環我比較上半年和下半年。只要我找到兩個不匹配的字符,我就會返回false。如果整個前半部分與數組的後半部分匹配,則for循環將完成,然後返回true。

+2

他/她沒有要求新的實施。世界上有一百萬迴文實現。他/他問爲什麼發佈的代碼不起作用。 –

0

什麼是實際發生的事情是.reverse()在當前位置倒轉數組,它然後存儲到數組,是不是有什麼參考你打電話給你的check()方法。

簡單的解決方法是改變你的if語句:

if (a[i] !== b.reverse()[i]) 
+0

雖然每次迭代都不會反轉'b'嗎? –

+0

這根本不起作用。 –

+0

@torazaburo https://jsfiddle.net/x62oqq6v/ - 在這裏工作,對不起讓人失望! – Ricktron3000

1

已編碼迴文的方式是太複雜了。

但是,您的代碼有一個問題:當您執行reverse()時,它也會更改原始數組。

所以你需要確保你通過slice()複製它。

您也可以直接發送一個布爾結果,而不是做一個10