亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

javascript - 編程,演算法的問題
PHP中文網(wǎng)
PHP中文網(wǎng) 2017-06-12 09:25:56
0
4
1055

前天面試了一個問題
請使用js,python,java,c,c 之類的語言,在10秒內(nèi)計算出100億的數(shù)據(jù),並且(只能在3秒內(nèi))完成,偶數(shù)在奇數(shù)前
格式如下
1,2,3,4,5
輸出結(jié)果是
2,1,4,3,6,5,
問題2:在1的程式碼之上,要求不能使用for while關(guān)鍵字,從100億裡面取所有的質(zhì)數(shù)(時間不能超過3秒)
這個怎麼搞?

PHP中文網(wǎng)
PHP中文網(wǎng)

認(rèn)證高級PHP講師

全部回覆(4)
我想大聲告訴你

第一個問題沒看懂,是說2個數(shù)字為一對,然後偶數(shù)在奇數(shù)前面?

第二個問題簡單啊,不能用循環(huán),那就用陣列迭代唄。

代言

話說 phpforeach 算麼(笑

我覺得面試官的意圖是讓你寫一個遞歸函數(shù)?嗯估計是。

Ty80

前天面試了一個問題
請使用js,python,java,c,c++之類的語言,在10秒內(nèi)計算出100億的數(shù)據(jù),並且(只能在3秒內(nèi))完成,偶數(shù)在奇數(shù)前
格式如下
1,2,3,4,5
輸出結(jié)果是
2,1,4,3,6,5,
問題2:在1的程式碼之上,要求不能使用for while關(guān)鍵字,從100億裡面取所有的質(zhì)數(shù)(時間不能超過3秒)
這個怎麼搞?


既然不能用 for while

那麼遞歸性能就不太夠。 。 。但是我還是用了一些。 。 For Performance

可能有很巧妙的辦法

。 。 。 100億 的量值 應(yīng)該是有的。 我還沒發(fā)現(xiàn)。

代碼

100 億有點大啊 我先 10 萬了

var n = 1000 * 1000; 
var test = new Array(n).fill(n).map((e, idx) => idx); 

這樣可以得到 10 萬長度的陣列 自然數(shù)。


Next

  1. 偶數(shù)在前 奇數(shù)在後

觀察之後發(fā)現(xiàn),奇數(shù) + 1、 偶數(shù) - 1 就可以了

var isEven = n => n % 2 === 0; 

var res001 = test.map((e, idx) => {
    if (isEven(e)){
        return e - 1; 
    } else {
        return e + 1; 
    }
}); 

完成第一個問題

ScreenShot One

Next

下一個問題是在上面的基礎(chǔ)上取得質(zhì)數(shù) 即從 zs 裡取得所有質(zhì)數(shù)

查了一下關(guān)於質(zhì)數(shù)的問題,別人說 質(zhì)數(shù)分佈在 6 的倍數(shù)的左邊或者右邊 那麼我只要遍歷 每一個6的倍數(shù)的左邊和右邊 並判斷他們是不是質(zhì)數(shù)即可。

連結(jié): 判斷一個數(shù)字是否為質(zhì)數(shù)/質(zhì)數(shù)-從普通判斷演算法到高效率判斷演算法思路

// 剔除第一個負(fù)數(shù) 
var zs = res001.slice(1); 

var is6x = n => n % 6 === 0; 


var isPrime = n => {
     let temp = Math.sqrt(n);  
     
     for(let i = 2; i <= temp; i++){
         if(n % i === 0){
             return false; 
         }
     }
     
     return true;  
}  


var lasts = zs.filter(is6x).reduce((acc, cur) => {
    let left = cur - 1, right = cur + 1; 
    if (isPrime(left)) acc.push(left); 
    if (isPrime(right)) acc.push(right); 
    
    return acc; 
}, []); 

console.log(lasts); 

ScreenShot Two

不知道對不對 ...

不過還需要把 小於 6 的質(zhì)數(shù) 1 2 3 5 單獨拼回去。 (這裡沒拼)

性能

把上面寫的程式碼黏起來

var isEven = n => n % 2 === 0; 


var is6x = n => n % 6 === 0; 

var isPrime = n => {
     let temp = Math.sqrt(n);  
     
     for(let i = 2; i <= temp; i++)
        if(n %i== 0){
            return false; 
        }
     return true;  
}  


function timeTest(n){
    var test = new Array(n).fill(n).map((e, idx) => idx); 
    var res001 = test.map((e, idx) => {
        if (isEven(e)){
            return e - 1; 
        } else {
            return e + 1; 
        }
    }); 
    var zs = res001.slice(1); 
    
    var lasts = zs.filter(is6x).reduce((acc, cur) => {
        let left = cur - 1, right = cur + 1; 
        if (isPrime(left)) acc.push(left); 
        if (isPrime(right)) acc.push(right); 
        
        return acc; 
    }, []); 
    
    return lasts; 
}

test

var n = 1000 * 10000; 

console.time('1000 萬')
timeTest(n); 
console.timeEnd('1000 萬');

1000 萬 結(jié)果如圖


花了 13.8 秒 不可能做到 10 + 3 秒內(nèi)完成 100億 的體積。

我的電腦是 i5-4210M 12G Chrome 58

JavaScript 做不到這樣的效能: 100億 個數(shù)字 13 秒內(nèi) ....

好幾個 G 的資料 ......

按照上面的思路來做,即使是 C/C++ 估計也很難13秒跑完100億。

解決問題為主。

Links

判斷一個數(shù)是否為質(zhì)數(shù)/素數(shù)-從普通判斷演算法到高效率判斷演算法思路

Ty80

首先感謝樓上的求質(zhì)數(shù)的演算法,我貼下我的結(jié)果和程式碼(只有1000萬,一億瀏覽器直接炸掉了,而且求質(zhì)數(shù)那裡不能用遞歸(我測試的結(jié)果),不然也得炸,只能迭代)。

瀏覽器裡面的結(jié)果:

node裡面的結(jié)果:

var arr = [];

console.time("1000萬");
for( var i = 1; i <= 10000000; i++ ){
    arr.push(i);
}

for( var j = 0, len = arr.length;j < len; j+=2 ){
    arr[j]++;
    arr[j+1]--;
}

function isPrime(num,sqrt){
     if(num == 1)
     return false;
     if(num == 2 || num == 3 )  
     return true;  
     if(num % 6 != 1 && num % 6 != 5)  
     return false;  
     var tmp = sqrt(num);  
     for(var i= 5;i<=tmp; i+=6 )  
        if(num % i == 0 || num % ( i + 2) == 0 )  
        return false ;  

     return true;  
};

function getPrime(sourceArray,array,isPrime,sqrt){

    sourceArray.map(function(num,idx){
        if(isPrime(num,sqrt)){
            array.push(num);
        }
    });

    return array;
};

var result = getPrime(arr,[],isPrime,Math.sqrt);

console.timeEnd("1000萬");
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板