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>

 

posted @ 2017-08-23 15:34  随风而逝XXX  Views(170)  Comments(0Edit  收藏  举报