RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 572993
Accepted
stackanon
stackanon
Asked:2020-10-03 10:32:28 +0000 UTC2020-10-03 10:32:28 +0000 UTC 2020-10-03 10:32:28 +0000 UTC

对称差异

  • 772

Symmetric difference wiki
需要求数组的对称差。
我写了一个用于比较两个数组的函数,其中我将数组合并为一个并在循环中查找重复值。当我找到它时,我会删除它。

function sym() {
  var args = Array.prototype.slice.call(arguments);
  var result = compareTwoArray(arguments[0], arguments[1]);
  
  if (arguments.length > 2) {
    
    for (var i = 2; i < arguments.length; i++) {
      // console.log('result = ' + result);
      result = compareTwoArray(result, arguments[i]);
    }
    
  }
  
  return result;
}

function compareTwoArray() {
  var args = Array.prototype.slice.call(arguments);
  var result = [];
  
  var newArr = args.reduce(function(prev, curr) {
    return prev.concat(curr);
  })
  
  for (var i = 0; i < newArr.length; i++) {
    
    var count = 0;
    
    for (var j = i+1; j < newArr.length; j++) {

      if (newArr[i] === newArr[j]) {
        count += 1;
        newArr.splice(j, 1);
        j -= 1;
      }
      
    }

    if (count === 0) {
      result.push(newArr[i]);
    }
    
  }

  return result;
}

console.log(sym([1, 2, 3], [3, 1, 5]));
// [2, 5]
console.log(sym([1, 1, 3], [4, 6]));
// [1, 3, 4, 6]
console.log(sym([1, 1, 2, 5], [2, 2, 3, 5]));
// [1, 3]
console.log(sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5]));
// [1, 4, 5]
console.log(sym([1, 2, 5], [2, 3, 5], [3, 4, 5]));
// [1, 4, 5]

不知道如何处理重复值。
在一种情况下,它必须被删除。

[1, 2, 3]
[3, 1, 5]
[2, 5] - должен получиться
[2, 5] - получается с моим кодом

留在另一个。

[1, 1, 3]
[4, 6]
[1, 3, 4, 6] - должен получиться
[3, 4, 6] - получается с моим кодом

在另一个中保留(1)和删除(2)。

[1, 1, 2, 5]
[2, 2, 3, 5]
[1, 3] - должен получиться
[3] - получается с моим кодом
javascript
  • 4 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. Grundy
    2020-10-03T18:16:52Z2020-10-03T18:16:52Z

    Javascript 有一个类 Set,在这种情况下可以用作集合,结果,条目将几乎根据公式得出

    在此处输入图像描述

    下面的示例使用了扩展运算符和其余参数

    function sym(...arrs) {
      return arrs.reduce((acc, arr, i) => {
        var accSet = new Set(acc), // множество из элементов первого массива
          arrSet = new Set(arr); // множество из элементов второго массива
        return [...accSet].filter(a => !arrSet.has(a)) // элементы первого множества без элементо второго
          .concat( // объединение
            [...arrSet].filter(a => !accSet.has(a)) // элементы второго множества без элементов первого
          );
      }, []);
    }
    
    console.log(sym([1, 2, 3], [3, 1, 5]));
    // [2, 5]
    console.log(sym([1, 1, 3], [4, 6]));
    // [1, 3, 4, 6]
    console.log(sym([1, 1, 2, 5], [2, 2, 3, 5]));
    // [1, 3]
    console.log(sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5]));
    // [1, 4, 5]
    console.log(sym([1, 2, 5], [2, 3, 5], [3, 4, 5]));
    // [1, 4, 5]

    • 8
  2. Best Answer
    Visman
    2020-10-03T11:47:55Z2020-10-03T11:47:55Z

    两个数组的解决方案。虽然可以逐步处理 3 个或更多数组:首先是前两个,然后是第一个处理的结果和第三个数组,依此类推。

    function sum(arr1, arr2) {
      var tmp = arr1.concat(arr2), 
          result = [],
          value, sum;
      for (var i = 0; i < tmp.length; i++) {
        var value = tmp[i];
        if (result.indexOf(value) == -1) {
          sum = 0;
          if (arr1.indexOf(value) != -1) {
            sum++;
          }
          if (arr2.indexOf(value) != -1) {
            sum++;
          }
          if (sum == 1) {
            result.push(value);
          }  
        }  
      } 
      return result;
    }
    
    console.log(sum([1, 2, 3], [3, 1, 5]));
    // [2, 5]
    console.log(sum([1, 1, 3], [4, 6]));
    // [1, 3, 4, 6]
    console.log(sum([1, 1, 2, 5], [2, 2, 3, 5]));
    // [1, 3]

    • 7
  3. tutankhamun
    2020-10-03T17:17:32Z2020-10-03T17:17:32Z

    或者,您也可以这样做:

    function sym() {
      var diff = [];
      // Допускаем, что симметричная разность пустого массива - пустой массив,
      // а симметричная разность одного массива - разность пустого массива
      // и этого массива равна самому этому массиву.
      // Также симметрическая разность равна объединению минус пересечение,
      // поэтому...
      [].forEach.call(arguments, function(arg) {
        var sum = diff.concat(arg);
        // ...объединяем массивы...
        diff = sum.filter(function(item) {
          // ...оставляем только те элементы, которые не найдены хотя бы
          // в одном из массивов...
          return (-1 === arg.indexOf(item) || -1 === diff.indexOf(item));
        });
      });
      // ...возвращаем уникальные элементы
      // (иначе sym([1, 1, 2, 5], [2, 2, 3, 5]) будет [1, 1, 3])
      return diff.filter(function(item, index, self) {
        return self.indexOf(item) === index;
      });
    }
    
    console.log(sym());
    console.log(sym([1, 2, 3]));
    
    console.log(sym([1, 2, 3], [3, 1, 5]));
    console.log(sym([1, 1, 3], [4, 6]));
    console.log(sym([1, 1, 2, 5], [2, 2, 3, 5]));
    console.log(sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5]));
    console.log(sym([1, 2, 5], [2, 3, 5], [3, 4, 5]));

    • 3
  4. user207618
    2020-10-03T12:02:02Z2020-10-03T12:02:02Z

    根据描述:

    两组对称差

    这是两个集合的示例(扭曲更多集合,我想你可以猜到如何):

    function getDiff(a, b){
      let result  = [],
          pointer = -1;
      
      if(!Array.isArray(a) || !Array.isArray(b))
        throw new Error(`Both arguments must be arrays!`);
      
      a.forEach(e => {
        if((pointer = b.indexOf(e)) !== -1)
          b.splice(pointer, 1);
        else if(result.indexOf(e) === -1)
          result.push(e);
      });
      b.forEach(e => {
        if((pointer = a.indexOf(e)) !== -1)
          a.splice(pointer, 1);
        else if(result.indexOf(e) === -1)
          result.push(e);
      });
      
      return result;
    }
    
    // Пример с вики
    console.info(getDiff([1, 2, 3, 4, 5], [3, 4, 5, 6, 7]));
    
    // Ваши примеры
    console.info(getDiff([1, 2, 3], [3, 1, 5]));
    console.info(getDiff([1, 1, 3], [4, 6]));
    console.info(getDiff([1, 1, 2, 5], [2, 2, 3, 5]));

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5