二分之一

Just Jason's Blog

一道据说是企鹅的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