
集合交集算法挑战
方法一:
function sym(args) {
var arrs=[];
for(var a of arguments){
arrs.push(a);
}
var res=arrs.reduce(function(a,b){
a=del(a);
b=del(b); //数组分别处理
var arr=a.concat(b);
return del(arr,true); //拼接成一个大数组后,再进行一次处理
});
return res;
}
function del(arr,flag){ //排序and去重 flag为true表示删干净,否则留一个
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; //start为重复的起始位置
end=i+1; //end为重复的结束位置
}else{
if( end && end==i ){ //如果存在重复,即end有值,按照flag对数组进行处理。
if( flag ){
arr.splice(start,end-start+1);
i=i-(end-start+1);
}else{
arr.splice(start,end-start);
i=i-(end-start);
}
start=undefined; //没有重复了,start要还原
}
}
}
return arr;
}
sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5]);
方法二:
function sym() {
var arr = [],
rArr = [];
for (var i = 0; i < arguments.length; i++) {
arr.push(arguments[i]);
}
arr = arr.reduce(function (acc, val) {
var tArr = [];
for (var i = 0; i < acc.length; i++) {
if (val.indexOf(acc[i]) < 0) {
tArr.push(acc[i]);
}
}
for (var j = 0; j < val.length; j++) {
if (acc.indexOf(val[j]) < 0) {
tArr.push(val[j]);
}
}
return tArr;
}, []);
arr.forEach(function(val){
if(rArr.indexOf(val)<0){
rArr.push(val);
}
});
return rArr;
}
sym([1, 2, 3], [5, 2, 1, 4]);