2015-09-25 46 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