对《数组去重――一道前端校招试题》的解读
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:
答案2:
答案3:
得分点:
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
试题:
有这样一个数组,成员都是数字,例如
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
相关文章推荐
- 关于位运算的一道试题校招笔试题
- 2014年七月华为校招机试题目--最难的一道, 呵呵!
- 一道网易web前端校招面试题的问题?
- 一道腾讯前端试题,谁来试试身手
- 2012 腾讯校招Web前端笔试的一道题,很值得怀念。。。
- 一道腾讯前端试题,主要是算法
- 阿里2015校招前端方向的一道面试题
- 一道腾讯校招试题
- 一道腾讯前端试题 查找指定个数数字里面丢失的数字
- 【算法】一道腾讯前端试题,位图法(bitmap),感受一下什么叫做“算法”
- 一道腾讯前端试题
- 一道腾讯校招试题
- 前端面试试题
- 西邮linux兴趣小组2015纳新试题之我的解读
- 一道前端面试题?求大神解答
- 一道前端面试题,关于函数声明和函数表达式
- 【Windows 程序设计】【校招中常见的算法】【TensorFlow】【前端数据结构】| Chat · 预告
- [置顶] 2018华为校招机试题目
- 一道试题引发的血案
- 微软的一道笔试编程试题