昨天去面試,作了個面試題,數組去重,回來查了一下,總結有這幾種:面試
方法1:數組
1. 使用新的數組存放去重後的結果ide
2. 循環遍歷未去重的數組,將該數組的的每個元素與去重數組的的每一個元素相比較,若是不相等就把該元素添加到已經去重的數組中this
// 方法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:spa
1.先將原數組進行排序.net
2.檢查原數組中的第i個元素 與 結果數組中的最後一個元素是否相同,由於已經排序,因此重複元素會在相鄰位置prototype
3.若是不相同,則將該元素存入結果數組中3d
// 方法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:code
1.先將原數組進行排序htm
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