對於沒參加過互聯網企業招聘,或是沒有參加過大型互聯網企業招聘的人來講,能以這些公司的面試題作爲鍛鍊,無疑是一種很是好的學習和進步的途徑。下面是一道騰訊的前端面試題(JS解答),題目自己在現實中意義不大,主要是考察應試者對js及算法的理解程度,本文給出了三種答案,期待有更大的俠來一試身手,作出更好的解答。html
題目:有一組數字,從1到n(假設n=10000),從中任意刪除了3個數,順序也被打亂,剩餘數字放在一個n-3的數組裏,請找出丟失的數字,要求算法比較快。前端
方法一,(我寫的程序):面試
var ary = [1, 5, 7, 6, 4, 8, 10]; var n = ary.length + 3; var newAry = []; document.write("假設n=" + n + "<br/>"); ary.sort(function(a, b){ return a - b; }); document.write("初始數組:" + ary + "<br/>"); for(var i = 1, j=0; i <= n; i ++,j++){ var diff = ary[j] - i; if(!ary[j]){ newAry.push(i); } else if(diff > 0){ for(var k = 0; k < diff; k ++){ newAry.push(i++); } } } //alert(newAry); document.writeln("缺乏的數:" + newAry);
方法一 DEMO: http://www.threesnow.com/code/094/method_01.html算法
下面是另外兩位工程師給出的答案(本文的最後會給出一位網友對三種實現的效果測試對比)數組
方法二,學習
var n = 10; var oldArr = [5,1,6,3,7,8,10];//缺失的源數組997個數; var newArr = Array(11); var lostArr = [];//要找的數的數組 for(var i = 0; i < n-3; i++) { newArr[oldArr[i]] = 1; } for(var j = 0; j < newArr.length; j++) { if(!newArr[j]) { lostArr.push(j); } } lostArr.shift(0); alert(lostArr);
方法二 DEMO:http://www.clearthem.com/code/094/method_02.html
測試
方法三,spa
var num = [2,1,3,5,4,6,7,9,10,11,12,14,15,17,18,19,20,22,23,21]; num = num.sort(function(a,b){return a-b}); var y={}; for(var i=0;i<num.length;i++){ y[num[i]] = num[i]; } var m=1; var k=[]; while(m<=23){ if(!(m in y)){ k.push(m); } m++; } alert(k);
方法三 DEMO: http://www.clearthem.com/code/094/method_03.htmlcode
有位網友對上面三種方法進行了運算時間的測試(爲了測試效果明顯,他將數據量增長到了十萬條),測試效果以下:htm
方法一,200ms左右;
方法二,70ms左右;
方法三,260ms左右。
具體什麼樣,我本身並無測試,不過以這位網友提供的結果來看,個人答案還不是最差的,呵呵~~
期待你們的改正和更好的答案,