问题
This was an Amazon interview question I had an my answer was
function intersection ( A , B )
{
var C = [];
for ( var a in A ) if ( B.indexOf(a) != -1 ) C.push(a);
return C;
}
and he asked what the order of complexity was and I said, and I quote exactly,
O(m * n) where m=A.length and n=B.length
and he was saying there's a better way to do it and I was like WTF??????? He was saying use A and B as Objects and I was like
"But you said these were arrays That was your question!!!!"
Can someone help me out here?
回答1:
If you know that the array values are strings or numbers, you can create an object that's got the values as property names and truthy values for each. Then you can use simple object lookup in a pass through the second array.
Something like:
function intersection ( A , B )
{
var m = A.reduce(function(m, v) { m[v] = 1; return m; }, {});
return B.filter(function(v) { return m[v]; });
}
edit — to remove duplicates from the result, another .reduce() pass could be used:
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;
}
来源:https://stackoverflow.com/questions/32786654/finding-the-intersection-of-two-arrays-in-javascript