Symmetric Difference(freecodecamp高级算法2)
创建一个函数,接受两个或多个数组,返回所给数组的 对等差分(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}
).
<html> <head> <title></title> <script type="text/javascript"> window.onload = function(){ function sym(args) { var arrs = []; for(var a of arguments){ arrs.push(a); } args = arrs.reduce(function(a,b){ //1.先分别给a,b数组自去重(保留一个重复数) a = del(a,false); b = del(b,false); //2.然后在将两个数组连接在一起 var arr = a.concat(b); //再给新数组去除所有重复数据(不需要保留) return del(arr,true); }); return args; } function del(arr,flag){ //自去重时,flag为flase(需要保留一个重复的数) var start,end; arr.sort(function(a,b){ //数组由小到大排序,方便筛查重复数据 return a-b; }); for(var i=0;i<arr.length;i++){ if(arr[i] == arr[i+1]){//发现重复 start=(start===undefined)?i:start;//重复开始位置 end = i+1;//重复结束位置 }else{ if(end && end==i){//如果存在重复,即end有值,按照flag对数组进行处理 if(flag){ arr.splice(start,end-start+1);//从arr中删除从start开始的(end-start+1)个数据 i = i - (end-start+1); }else{ arr.splice(start,end-start); i = i - (end-start); } //去除一次重复数据之后,需要还原数据 start = undefined; end = undefined; } } } return arr; } sym([1, 2, 3], [5, 2, 1, 4]); } </script> </head> <body> </body> </html>