这是一个亚马逊的采访问题,我的回答是
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
他说这是一个更好的方法,我就像WTF ???????他说使用A
和B
作为对象,我就像
“但你说这些是数组这是你的问题!!!!”
有人可以帮助我吗?
答案 0 :(得分:6)
如果您知道数组值是字符串或数字,则可以创建一个对象,该对象将值作为属性名称和每个值的truthy值。然后,您可以在传递第二个数组时使用简单的对象查找。
类似的东西:
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;
}