久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

JavaScript之數(shù)組去重

 昵稱10504424 2015-08-28

首先,,我想到的是另建一個結果數(shù)組,,用來存儲原始數(shù)組中不重復的數(shù)據(jù),。遍歷原始數(shù)組依次跟結果數(shù)組中的元素進行比較,檢測是否重復,。于是乎,,我寫出了如下代碼A:

按 Ctrl+C 復制代碼
按 Ctrl+C 復制代碼

 

  寫完之后,忽然想起來前幾天剛看的ECMAScript 5中的數(shù)組方法 indexOf 可以檢索數(shù)組元素,。于是我又使用 indexOf 方法替代了第二層循環(huán),,寫出了如下代碼B:

按 Ctrl+C 復制代碼
按 Ctrl+C 復制代碼

  哈,代碼一下子從17行變成了9行了,,簡潔多了,。高三數(shù)學大題解法一般都不止一種的啊,然后我就繼續(xù)再想其他方法了,。indexOf 方法的意思是搜索整個數(shù)組中具有給定值的元素,,返回找到的第一個元素的索引,沒有找到就返回 -1 ,,第一個參數(shù)就是要搜索的值,,第二個參數(shù)可選:它指定數(shù)組中的一個索引,從那里開始搜索,,如果省略這個參數(shù),,則從頭搜索。思維一發(fā)散,,想到了前面方法都是 檢測值是否重復的,,現(xiàn)在有了indexOf 方法不就可以根據(jù)檢測到的每個元素的第一次出現(xiàn)時的索引和這個元素自身的索引值比較相等來判斷是否重復嘛。所以,,我又寫出了代碼C:

復制代碼
1 Array.prototype.clearRepetitionC = function(){
2     var result = [this[0]];
3     for(var i=1; i<this.length; i++){
4         if(this.indexOf(this[i]) == i){
5             result.push(this[i]);
6         }
7     }
8     return result;
9 } 
復制代碼

  寫完這個,,又繼續(xù)想了想,實在是想不出其他方法了(哎,,這三個方法都是很基礎的方法,,數(shù)據(jù)結構、算法沒學好,,真心想不出啥驚天地,、泣鬼神的牛逼 方法來)。于是,,我就去對照答案,,檢驗自己了。一看答案,,發(fā)現(xiàn)自己還是真實太弱了,,簡單的問題還是有些奇思妙想的。下面不是自己想的了,,就不再說太多我的 心路歷程了,。廢話不多說,直接上經典的答案+解析了,。

  首先,,先說一個算法中經常說的以空間換時間的解法,保持隊形,,我們就叫它代碼D吧:

復制代碼
 1 Array.prototype.clearRepetitionD = function(){
 2     var result = [];
 3     var obj = {};
 4     var key,type;
 5     for(var i=0; i<this.length; i++){
 6         key = this[i];
 7         type = typeof key;
 8         if(!obj[key]){
 9             obj[key] = [type];
10             result.push(key);
11         }else if(obj[key].indexOf(type)){
12             obj[key].push(type);
13             result.push(key);
14         }
15     }
16     return result;
17 } 
復制代碼

  這個方法中在遍歷原始數(shù)組時用一個對象 obj 的屬性來保存原始數(shù)組中元素的值,。同時這個屬性的值是一個數(shù)組,用來存儲這個屬性的類型,,這一點可以把原始數(shù)組中類似數(shù)字1元素和字符串‘1’的元素區(qū)分 開,。這個方法通過額外構建一個對象的方式降低了上面三種方法中indexOf方法所花費的時間,可以說較為高效吧,。

  如果你已經滿足于上面所說的以空間換時間的高效方法而不繼續(xù)看下去的話,,那就大錯特錯了,好戲總在后頭嘛?,F(xiàn)在好戲開場,,毫無疑問,就是代碼E了:

復制代碼
 1 Array.prototype.clearRepetitionE = function(){
 2     var result = [];
 3     for(var i=0; i<this.length; i++){
 4         for(var j=i+1; j<this.length; j++){
 5             if(this[i] === this[j]){
 6                 j = ++i;
 7             }
 8         }
 9         result.push(this[i]);
10     }
11     return result;
12 } 
復制代碼

  代碼D以空間換時間,,感覺也就一般般,。那么代碼E呢?我擦,,這代碼是錯誤的吧,,這個真的能去重嗎?是的,,起初我都沒看懂這代碼,,看了解析后又看 了一遍之后才明白過來。那么,,沒看懂的看官也要認真的看解析了:第一層從前往后遍歷原始數(shù)組,,第二層循環(huán)是檢測每個元素是否跟它之后的元素重復,如果它之 后有重復元素則跳過它,;如果這個元素之后所有元素都跟他不重復了,,則把它添加到結果數(shù)組中。這個方法實現(xiàn)思路就是:獲取無重復的最右一值添加到結果數(shù)組 中,,這個跟第一種方法相比也優(yōu)化了第二層的循環(huán),,效率要比它高,不過這個方法的結果數(shù)組中元素的順序跟原始數(shù)組中元素的順序不一樣了,。

  看完了代碼E解析的你是不是已經伸出了大拇指,、投放出了敬佩的目光呢?(這些鮮花和榮譽別給我,,應該給寫這個方法的大神去),。下面再說最后一個方法:那就是先排序,,再去重。老規(guī)矩,,它叫代碼F:

復制代碼
 1 Array.prototype.clearRepetitionF = function(){
 2     this.sort();
 3     var result = [this[0]];
 4     for(var i=1; i<this.length; i++){
 5         if(this[i] !== result[result.length-1]){
 6             result.push(this[i]);
 7         }
 8     }
 9     return result;
10 } 
復制代碼

  這個先用數(shù)組的排序方法sort進行數(shù)組元素排序,,然后再進行去重工作。這個效率真的會高嗎,?哎,,沒學好算法什么的,我的答案也就三個字:不知道,。如果你知道歡迎評論區(qū)告訴我,。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多