对等差分数组
来源:互联网 发布:中学生网络成瘾案例 编辑:程序博客网 时间:2024/04/28 13:23
创建一个函数,接受两个或多个数组,返回所给数组的对等差分(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}
).
思路
问:怎么把大象装进冰箱里?第一步,把冰箱门打开。那么怎么解决这道题目?第一步,拿到所有可能传入的作为参数的待处理数组。
一看到那些未显示声明或者不确定个数的参数,就能想到要好好利用一下 arguments
这个ECMAScript中的特殊对象了。
在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们。
接下来,把大象装进冰箱里,哦,不,是把 arguments
对象的集合放进一个新数组。
有两种方法可以办到。第一种,老生常谈的 for()
循环。
var arr = []; for(var i = 0; i < arguments.length; i++){ arr.push(arguments[i]); }
第二种是使用 ECMA-262 第六版标准添加的 Array.from()
方法。它可以将两类对象转为真正的数组: 类似数组的对象(array-like object) 和 可遍历(iterable)的对象 。
var arr = Array.from(arguments);
通读题目,其实就是要求我们把参数数组中的前两项做运算,得到一个所有项都没同时出现在两个数组中的新数组,然后把这个新数组作为首项,继续与后面的数组进行同样操作。
我们第一步得到的参数数组是个二维数组,而函数最后返回的是一个结果,一维数组,很容易就想到Array归并用的 reduce()
方法。
reduce()
传入的函数带有4个参数:前一个值 prev
、当前值 cur
、项的索引 index
、数组对象 array
。
分别对 prev
和 cur
进行过滤,返回对方数组中不存在的值,连接成为新数组。最后对新数组去重。
去重时,可以另写一个函数,像这样:
function unique(array){ var n = []; for(var i = 0;i < array.length; i++){ if(n.indexOf(array[i]) == -1) { n.push(array[i]); } } return n;}
也可以在返回结果中继续利用 filter()
去重:
//整个函数的返回值return temp.filter(function(item,index,array){ return array.indexOf(item) == index; });
解法
function sym(args) { var arr = []; for(var i = 0; i < arguments.length; i++){ arr.push(arguments[i]); } var temp = arr.reduce(function(prev,cur,index,array){ var a = prev.filter(function(item){ return cur.indexOf(item) < 0; }); var b = cur.filter(function(item){ return prev.indexOf(item) < 0; }); return a.concat(b); }); return temp.filter(function(item,index,array){ return array.indexOf(item) == index; }); //或者调用外部函数去重;function unique(array)见“思路”部分 //return unique(temp);}
- 对等差分数组
- JS:对等差分
- 差分对等长绕线问题
- 差分数组
- 差分数组概述
- 差分数组
- 差分数组
- 差分数组
- 差分数组的总结
- 差分数组的总结
- 差分数组练习1
- 差分数组练习2
- luogu3368 树状数组+差分
- tyvj 2075 差分数组+二分
- 【例题】【差分数组】NKOJ3754 数列游戏
- 6th 【差分数组】数列游戏
- HDU6170【DP+树状数组+差分维护】
- POJ 2155 二维树状数组+差分
- 用Xshell 看日志 查数据库
- Zedboard---实验二仿真
- HTML+CSS实战提升
- linux下jdk卸载与安装
- 2017.04.15【NOIP2017提高组】模拟赛B组 T1:偷懒的小X
- 对等差分数组
- Swing线程之SwingUtilities.invokeLater解释
- 链表排序——选择排序法(纯C语言版)
- 基于http协议的api接口对于客户端的身份认证方式以及安全措施
- 蜘蛛牌
- FPgrowth
- 浅谈char类型的范围
- device manager
- 浅析fork系统调用