昨天去面试,做了个面试题,数组去重,回来查了一下,总结有这几种:
方法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())
方法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 }
方法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 }
方法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 }
比较这几个方法的运行时间,
依次应该为:
方法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