一道騰訊前端試題,誰來試試身手
對于沒參加過互聯(lián)網(wǎng)企業(yè)招聘,或是沒有參加過大型互聯(lián)網(wǎng)企業(yè)招聘的人來說,能以這些公司的面試題做為鍛煉,無疑是一種非常好的學(xué)習(xí)和進步的途徑。下面是一道騰訊的前端面試題(JS解答),題目本身在現(xiàn)實中意義不大,主要是考察應(yīng)試者對js及算法的理解程度,本文給出了三種答案,期待有更大的俠來一試身手,做出更好的解答。
題目:有一組數(shù)字,從1到n(假設(shè)n=10000),從中任意刪除了3個數(shù),順序也被打亂,剩余數(shù)字放在一個n-3的數(shù)組里,請找出丟失的數(shù)字,要求算法比較快。
方法一,(我寫的程序):
- var ary = [1, 5, 7, 6, 4, 8, 10];
 - var n = ary.length + 3;
 - var newAry = [];
 - document.write("假設(shè)n=" + n + "<br/>");
 - ary.sort(function(a, b){
 - return a - b;
 - });
 - document.write("初始數(shù)組:" + 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("缺少的數(shù):" + newAry);
 
方法一 DEMO: http://www.threesnow.com/code/094/method_01.html
下面是另外兩位工程師給出的答案(本文的***會給出一位網(wǎng)友對三種實現(xiàn)的效果測試對比)
方法二,
- var n = 10;
 - var oldArr = [5,1,6,3,7,8,10];//缺失的源數(shù)組997個數(shù);
 - var newArr = Array(11);
 - var lostArr = [];//要找的數(shù)的數(shù)組
 - 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
方法三,
- var num = [2,1,3,5,4,6,7,9,10,11,12,14,15,17,18,19,20,22,23,21];
 - numnum = 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.html
有位網(wǎng)友對上面三種方法進行了運算時間的測試(為了測試效果明顯,他將數(shù)據(jù)量增加到了十萬條),測試效果如下:
方法一,200ms左右;方法二,70ms左右;方法三,260ms左右。
具體什么樣,我自己并沒有測試,不過以這位網(wǎng)友提供的結(jié)果來看,我的答案還不是最差的,呵呵~~
原文鏈接:http://www.cnblogs.com/ilian/archive/2012/07/01/tx-test-entry.html















 
 
 






 
 
 
 