数组去重

昨天去面试,做了个面试题,数组去重,回来查了一下,总结有这几种:

方法1:

1. 使用新的数组存放去重后的结果

2. 循环遍历未去重的数组,将该数组的的每一个元素与去重数组的的每个元素相比较,如果不相等就把该元素添加到已经去重的数组中

  // 方法1
        var a = [1,1,2,3]
        Array.prototype.unique = function () {

            //创建一个数组存放
            var temp = [this[0]]

            for(var i = 1; i < this.length;i++){
                var isRepeat = false // 默认当前不重复
                for(var j = 0; j < temp.length; j ++){
                    if(this[i] == temp[j]){
                        isRepeat = true
                        break;
                    }
                }
                if(!isRepeat){
                    temp.push(this[i])
                }
            }

            return temp;
        }

        console.log(a)
        a.unique()
        console.log( a.unique())
View Code

方法2:

1.先将原数组进行排序

2.检查原数组中的第i个元素 与 结果数组中的最后一个元素是否相同,因为已经排序,所以重复元素会在相邻位置

3.如果不相同,则将该元素存入结果数组中

 // 方法2
        Array.prototype.unique2 = function (){

            //创建一个数组存放
            var temp = [this[0]]

            // 对原数组进行排序
            this.sort()

            for(var i = 1; i < this.length;i++){

                this[i] != temp[temp.length - 1] && temp.push(this[i])

            }

            return temp

        }
View Code

方法3:

1.先将原数组进行排序

2.检查原数组中的第i个元素 与 结果数组中的最后一个元素是否相同,因为已经排序,所以重复元素会在相邻位置

3.如果不相同,则将该元素存入结果数组中

// 方法3  时间复杂度O(n) = n
        Array.prototype.unique3 = function (){
            //创建一个数组存放
            var temp = []
            var obj  = {}

            for(var i = 0; i < this.length;i++){

                if(!obj[this[i]]){
                    temp.push(this[i])
                    obj[this[i]] = 1
                }
            }
            return temp
        }
View Code

方法4:这个方法跟方法3一样,只是我觉得,为什么要创建一个对象来存放呢,只是存放一个值,那么一维数组是不是也可以实现。查了一下数组和对象的区别,觉得像这样不需要循环的时候,又只需要存一个数字的时候,数组和对象其实是一样的。

 // 方法4 时间复杂度O(n) = n
        Array.prototype.unique4 = function (){
            //创建一个数组存放
            var temp = []
            var obj  = []

            for(var i = 0; i < this.length;i++){

                if(!obj[this[i]]){
                    temp.push(this[i])
                    obj[this[i]] = 1
                }
            }
            return temp
        }
View Code

比较这几个方法的运行时间,

依次应该为:

方法1:O(n) = n*n

方法2:O(n) = n + O(sort())

方法3:O(n) = n 

方法4:O(n) = n 

当随机生成一个长度为10000000数组,打印这几个的运行时间

如下图所示:

经过多次打印,方法3和方法4都是差不多的。都可以使用。

原文地址:http://www.jb51.net/article/46154.htm


原文地址:https://www.cnblogs.com/i-jia/p/5367434.html