2015-09-25 49 views
3

這是亞馬遜的面試問題我有我的回答是查找兩個數組的交集在Javascript

function intersection (A , B) 
{ 
    var C = []; 
    for (var a in A) if (B.indexOf(a) != -1) C.push(a); 
    return C; 
} 

,他問什麼複雜的順序是和我說,我引用準確,

O(m * n個),其中m =則爲a.length和n = b.length個

和他說有一個更好的方式來做到這一點,我很喜歡跆拳道?????? ?他說,使用AB爲對象,我很喜歡

「但是你說這些都是陣列那是你的問題!!!!」

有人可以幫我一下嗎?

+0

我不知道如何'作爲使用對象的幫助,但是如果你在開始之前從'B'開始查找表(字典),那麼你可以在O(n)中完成。 – Lee

+3

如果您在另一個JavaScript訪問中,請勿使用'for ... in'來遍歷數組。 – Pointy

+1

btw在這個問題上有很多問題,例如:http://stackoverflow.com/questions/1885557/simplest-code-for-array-intersection-in-javascript – Lee

回答

6

如果您知道數組值是字符串或數字,您可以創建一個對象,該對象的值分別爲屬性名稱和真值。然後,您可以在通過第二個數組的過程中使用簡單的對象查找。

喜歡的東西:

function intersection (A , B) 
{ 
    var m = A.reduce(function(m, v) { m[v] = 1; return m; }, {}); 
    return B.filter(function(v) { return m[v]; }); 
} 

編輯 —從結果中刪除重複項,另一個.reduce()通可用於:

function intersection (A , B) 
{ 
    var m = A.reduce(function(m, v) { m[v] = 1; return m; }, {}); 
    return B.reduce(function(rv, v) { 
     if (!rv.m[v]) { 
     rv.m[v] = 1; 
     rv.l.push(v); 
     } 
     return rv; 
    }, {m:{}, l:[]}).l; 
} 
+1

和如果值是對象,但引用相等是好的,您可以使用Set() – Touffy

+0

@Touffy是好點,事實上,您可以使用Set。我還沒有完全適應ES2015 :) – Pointy

+1

請注意,在實踐中,如果A.length或B.length很小,那麼實際上可以通過數組查找獲得更好的性能:http://jsperf.com/key-or -array-search/2(來自http://stackoverflow.com/questions/26353417/javascript-object-vs-array-lookup-performance) – nrabinowitz