微软面试--数组去重方法

题目:

实现数组去重
输入: arr数组,即需要去重的数组
输出: 返回去重后数组的长度

/*
    数组去重1:
    重新建立一个临时数组,遍历原数组中的元素,并判断每个元素是否在新数组中出现过。若没出现过则加入,出现过,则不加入。
    时间复杂度n^2,空间复杂度n

    @param arr 输入需要去重的数组
    @return 返回去重后数组的长度
    */
    function  array_unique1(arr){
        if(arr.length==0){
            return 0;
        }

        var temp=[];
        temp.push(arr[0]);
        for(var i=1,len=arr.length;i<len;i++){
            var j=0;//注意局部变量
            for(;j<temp.length;j++){
                if(temp[j]==arr[i]){
                    break;
                }
            }
            if(j==temp.length){//判断是否遍历完结束还是由于有重复结束,若是遍历完结束则将元素加入
                temp.push(arr[i]);
            }
        }
        arr=temp;
        console.log(arr.length);
        //return arr.length;
    }

    // var arr=[1,2,2,4,6,4,6];
    // array_unique1(arr);

     /*
    数组去重2:
    对数组进行排序,排序后重复的元素一定是相邻的,遍历数组,如果当前元素和上一个元素相等,那么是重复的。
    用index来记录不重复存放的下标,index得到到的即不重复的元素个数,遍历得到的是不同元素放在原数组的前面index个。splice()输出前index即不重复的元素。

    时间复杂度和空间复杂度取决于排序
    */
    function array_unique2(arr){
        if(arr.length==0){
            return 0;
        }
        arr.sort();
        var index=1;
        for(var i=1,len=arr.length;i<len;i++){
            if(arr[i]!==arr[i-1]){
                arr[index++]=arr[i];
            }
        }
        arr=arr.splice(0,index);
        console.log(arr);
        console.log(index);
        return index;
    }
    // var arr=[1,2,2,4,6,4,6];
    // array_unique2(arr);

    /*
    数组去重3:
    与1相比不用额外的存储空间,利用直接插入排序的思想,将数组分成两个部分,左边为不重复的部分,右边为等待遍历的部分。初始条件下左边为arr[0]。index表示左边部分不重复元素存放的下标。
    没有经过排序,数组原来的相对顺序可以保证。

    时间复杂度为n^2,空间复杂度为1
    */
    function array_unique3(arr){
        if(arr.length==0){
            return 0;
        }
        var index=1;
        for(var i=1,len=arr.length;i<len;i++){
            var j=0;
            for(;j<index;j++){
                if(arr[j]==arr[i]){
                    break;
                }
            }
            if(j==index){
                arr[index++]=arr[i];
            }
        }

        // arr=arr.splice(0,index);
        // console.log(arr);
        console.log(index);
        return index;
    }
    // var arr=[1,2,2,4,6,4,6];
    // array_unique3(arr);



    /*
    数组去重4:
    使用对象obj={},使用key和value的对应关系来实现。
    */

    function array_unique4(arr){
        if(arr.length==0){
            return 0;
        }
        var obj={};
        var res=[];
        for(var i=0;i<arr.length;i++){
            if(!obj.hasOwnProperty(arr[i])){
                res.push(arr[i]);
                obj[arr[i]]=1;
            }
            console.log(res);
        }
        console.log(res.length);
    }

    var arr=[1,2,2,4,6,4,6];
    array_unique4(arr);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值