codecamp

集合交集算法挑战

方法一:

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]);
判断电话号码算法挑战
收银系统算法挑战
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定