一道据说是企鹅的web前端面试题及解法
题目出自蓝色经典论坛:http://bbs.blueidea.com/thread-3044619-1-1.html
有一组数字,从1到n,从中减少了3个数,顺序也被打乱,放在一个n-3的数组里题:请找出丢失的数字,最好能有程序,最好算法比较快(假设n=10000)
当然解题方法很多,各位看客先尝试用自己的方法解一解,也许会有不一样的收获!
====================
以下是我的解决方法,仅供参考,不过我没有使用for,只使用sort;估计出题者还是考察jser的基础知识;
换了新方法,支持首尾及连续抽取!
附代码:
/*
*仅生成DEMO数组 arr
*按命题要求,arr是已知的,所以生成arr不计作计算时间
*/
var n = 10000; //长度为10000的测试数组
var arr = (function(){
var arr = [];
for(var i=1;i<=n;i++){
if(i!=526&&i!=5422&&i!=2563){ //抽出的数字
arr.push(i);
}
}
arr = shuffle(arr);
//打乱数组顺序
function shuffle(arr){
for(var rnd, tmp, i = arr.length; i; rnd = parseInt(Math.random() * i), tmp = arr[--i], arr[i] = arr[rnd], arr[rnd] = tmp);
return arr;
}
return arr;
})();
//---------------仅生成DEMO数组 arr-----------------//
//---------------找出三个被抽出的数字----------------//
//结果数组
var res = [];
var time = +(new Date); //开始计时点
//按数值大小排序
arr.sort(function(a,b){
return a-b;
});
//给首尾各加一个数,以保证以下的算法能找到首尾两个被抽出的数
arr.unshift(0);
arr.push(n+1);
//找到抽出的数
arr.sort(function(a,b){
if(b-a!=1){
while(a<b-1){
a++
res.push(a);
}
}
});
time = (+(new Date))-time; //结束计时点
alert("找到的数:"+res+",所花费的时间:"+time+"毫秒");
最后修改时间:2014年9月8日星期一晚上8点57