【问题标题】:How to get the differences between arrays and return them如何获取数组之间的差异并返回它们
【发布时间】:2019-06-25 15:46:59
【问题描述】:

我正在练习我的面试技巧,我想解决这个问题:

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

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

你问的是对称还是非对称?

我会以最快的速度去

谢谢!

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    以下两种实现方式。

    第一个有利于可读性,适用于正常大小的数组。

    您不能比第二种方法渐近更快(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
      );
    })();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多