FreeCodeCamp筆記之:Symmetric Difference

题目

创建一个函数,接受两个或多个数组,返回所给数组的对等差分(symmetric difference)(△or⊕)数组.给出两个集合 (如集合A = {1, 2, 3}和集合B = {2, 3, 4}), 而数学术语 "对等差分" 的集合就是指由所有只在两个集合其中之一的元素组成的集合(A △ B = C = {1, 4}). 对于传入的额外集合 (如D = {2, 3}), 你应该安装前面原则求前两个集合的结果与新集合的对等差分集合 (C △ D = {1, 4} △ {2, 3} = {1, 2, 3, 4}).
当你遇到困难的时候,记得查看错误提示、阅读文档、搜索、提问。
这是一些对你有帮助的资源:
Array.reduce()
Symmetric Difference

思路

  1. 天杀的.....我能放弃么,怎么又是数学题;
  2. 对等差分,都是啥......百度之,很悲惨,没搜到;而且很不幸的是,题目提示的Symmetric Difference的解释页面网址指向是油土鳖,我等不翻墙是打不开的,我也懒得翻墙;
image.png
  1. 再仔细阅读题目的举例:

指由所有只在两个集合其中之一的元素组成的集合(A △ B = C = {1, 4}).
对于传入的额外集合 (如D = {2, 3}), 你应该安装前面原则求前两个集合的结果与新集合的对等差分集合 (C △ D = {1, 4} △ {2, 3} = {1, 2, 3, 4}).

  1. 所以意思就是 将集合A 、B中互相没出现的组成新的集合C,然后用C来和D比较,将C、D中互相没出现的又组成新的集合;
    5.很显然,最终只会得到唯一的一个结果,那会用到 reduce(),题目也有提示使用该方法;

解答

function sym(args) {
 var arr = args.slice.call(arguments);          //转化为单个数组;
 var C =arr.reduce(function(prev,cur,index,array){
    return prev.filter(function(item){
            return cur.indexOf(item)==-1;       //返回A集合中不存在于B集合的 
        }).concat(                              //拼接起来
            cur.filter(function(item){
            return prev.indexOf(item) < 0;      //返回B集合中不存在于A集合的
        })
       );      
    });
 return C.filter(function(item,index,array){   
    return array.indexOf(item) == index;  //解决数组内部本身也可能存在重复
  });  
}
sym([1, 2, 3], [5, 2, 1, 4]);
  • 这道题折腾了很久,主要是 filter创建新数组的用法倒腾了好久,忘记了;
  • 再一个就是indexOf 来验证数值在两个数组中是否互相存在也是折腾了好久
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容