對《數組去重——一道前端校招試題》的解讀

 很多校招題是沒有嚴格的標準答案的,只有知識點,只要幾個關鍵點能答上來,不管程序是否真的能跑通,都可以拿分的。比如最常見的一道題:

試題:
有這樣一個數組,成員都是數字,例如
var a = [1,2,3,4,5,2,3,4,6,7,8];
請實現a.distinct()方法,用來給數組a去掉重複值,要求對Array的原型進行擴展方法,並儘可能做到效率最優。

考察點:
1,考察應試者是否理解原型鏈
2,考察應試者是否由意識的控制算法的時間複雜度,瞭解應試者對專業課知識的掌握程度
3,考察應試者對js數組函數的瞭解程度

答案1:
Array.prototype.distinct function(){
    var [],b=[],oa this.concat();
    for(var 1;i<oa.length;i++){
        for(var 0;j<i;j++){
            if(b.indexOf(j)>-1)continue;
            if(oa[j] == oa[ i]){
                b.push(j);
            }
        }
    }
    this.splice(0,this.length);
    for(var 0;i<oa.length;i++){
        if(b.indexOf(i)>-1)continue;
        this.push(oa[i ]);
    }
    return this;
};
答案2:
Array.prototype.distinct function(){
    for(var 0;i<this.length;i++){
        var this[i ];
        this.splice(i,1,null);
        if(this.indexOf(n) 0){
            this.splice(i,1,n);//不存在重複
        }else{
            this.splice(i,1);//存在重複
        }
    }
    return this;
};
答案3:
Array.prototype.distinct function(){
    var self this;
    var _a this.concat().sort();
    _a.sort(function(a,b){
        if(a == b){
            var self.indexOf(a);
            self.splice(n,1);
        }
    });
    return self;
};
得分點:
1,應試者起碼應該自覺通過Array.prototype.distince來實現函數,若沒有這樣做,則扣分50%
2,應試者起碼會給出答案1,得分30%,如果沒有使用splice和concate,扣分20%
3,給出答案2的,得分80%,算法複雜度控制在O(n)
4,給出答案3的,得滿分,算法複雜度控制在O(1)

解讀:
 1. Array的concat方法是將多個數組合併成一個數組,如果參數是字符串,亦將字符串合併到數組中,值得注意的是調用concat方法後會返回一個新數組,而調用sort方法是在原來的數組中操作,不會返回新數組。
 2.答案一做的不好,比如設置了a[]卻沒有使用,原理就是使用雙重循環,對每個數組元素進行比較,我做的如下:
     Array.prototype.distinct = function(){
        for(i=0;i<this.length;i++){
           for(j=i+1;j<this.length;j++){
              if(this[i]==this[j]){
                this.splice(j,1);
                j=j-1;// 因爲調用splice方法後oa的長度縮短1,且元素往前移動一位。
              }
           }
        }
      return this;
    }

原文: http://uedmagazine.com/ued/comments.php?y=10&m=11&entry=entry101114-131904
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章