如何获取数组之间的差异并返回它们

时间:2019-06-25 15:46:59

标签: javascript arrays

我正在练习我的面试技巧,但我遇到了要解决的问题:

“编写一个处理两个整数数组的函数。 每个数组将只有不同的数字(同一数组中没有相同整数的重复),并且这些数组未排序。 找出哪些数字在数组1中,但不在数组2中,哪些数字在数组2中,但不在数组1中。”

我也试图提高我的ES6 +技能,所以我知道一个很好的循环使用它们的方法是使用array.map,如果我想要两者之间的区别,我需要Array.prototype.filter()这样,我会得到一个包含arr1不在arr2中的所有元素的数组,反之亦然

您问对称还是非对称?

我会尽快去的

谢谢!

1 个答案:

答案 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
  );
})();