您的位置:首页 > Web前端

对《数组去重――一道前端校招试题》的解读

2011-11-17 00:16 204 查看
很多校招题是没有严格的标准答案的,只有知识点,只要几个关键点能答上来,不管程序是否真的能跑通,都可以拿分的。比如最常见的一道题:

试题:

有这样一个数组,成员都是数字,例如

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 a = [],b=[],oa = this.concat();
for(var i = 1;i<oa.length;i++){
for(var j = 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 i = 0;i<oa.length;i++){
if(b.indexOf(i)>-1)continue;
this.push(oa[i ]);
}
return this;
};

答案2:

Array.prototype.distinct = function(){
for(var i = 0;i<this.length;i++){
var n = 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 n = 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: