前天面試了一個問題
請使用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秒)
這個怎麼搞?
認(rèn)證高級PHP講師
第一個問題沒看懂,是說2個數(shù)字為一對,然後偶數(shù)在奇數(shù)前面?
第二個問題簡單啊,不能用循環(huán),那就用陣列迭代唄。
前天面試了一個問題
請使用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 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ù)。
偶數(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;
}
});
完成第一個問題
下一個問題是在上面的基礎(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);
不知道對不對 ...
不過還需要把 小於 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億。
解決問題為主。
判斷一個數(shù)是否為質(zhì)數(shù)/素數(shù)-從普通判斷演算法到高效率判斷演算法思路
首先感謝樓上的求質(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萬");