我正在练习我的面试技巧,但我遇到了要解决的问题:
“编写一个处理两个整数数组的函数。 每个数组将只有不同的数字(同一数组中没有相同整数的重复),并且这些数组未排序。 找出哪些数字在数组1中,但不在数组2中,哪些数字在数组2中,但不在数组1中。”
我也试图提高我的ES6 +技能,所以我知道一个很好的循环使用它们的方法是使用array.map,如果我想要两者之间的区别,我需要Array.prototype.filter()这样,我会得到一个包含arr1不在arr2中的所有元素的数组,反之亦然
您问对称还是非对称?
我会尽快去的
谢谢!
答案 0 :(得分:0)
下面两个实现。
第一个支持可读性,适用于普通大小的数组。
尽管您可以更快地处理较小的数组并线性减少执行的指令数量,但您不能比第二种方法(O(n*log(n))
中的复杂度)渐近地运行。
const arr1 = [1,2,9,8,6,7];
const arr2 = [8,6,3,4,1,0];
// most readable
console.log(
// arr1 without arr2
arr1.filter(x => arr2.indexOf(x)==-1),
// arr1 and arr2
arr1.filter(x => arr2.indexOf(x)!=-1),
// arr2 without arr1
arr2.filter(x => arr1.indexOf(x)==-1)
);
// fastest - O(nln(n))
(() => {
const count =
// concatenate - O(n)
[...arr1, ...arr1, ...arr2]
// sort - O(nln(n))
.sort()
// count - O(n)
.reduce((acc, cur) => {
acc[cur] = (acc[cur] || 0) +1;
return acc;
}, {});
// separate - O(n)
const a1 = [];
const a12 = [];
const a2 = [];
for (let i in count) {
switch(count[i]) {
case 1: a2.push(+i); break;
case 2: a1.push(+i); break;
case 3: a12.push(+i); break;
}
}
console.log(
a1, // arr1 without arr2
a12, // arr1 and arr2
a2 // arr2 without arr1
);
})();