[英]Project Euler #43: Why does my answer take so long?
我正在解決問題 43
我已經做了一個蠻力解決方案。 但它應該在 O(n) 時間內執行。
在我的電腦上需要幾個小時才能完成。 我可以做些什么來加快計算復雜度?
const main = () => {
let total = 0;
for (let i = 1023456789; i < 9876543211; i++) {
// for (let i = 1406357289; i < 1406357290; i++) {
if (isPandigital(i)) {
var d = i.toString().split("");
if (checkSubString (d[1], d[2], d[3], 2) &&
checkSubString (d[2], d[3], d[4], 3) &&
checkSubString (d[3], d[4], d[5], 5) &&
checkSubString (d[4], d[5], d[6], 7) &&
checkSubString (d[5], d[6], d[7], 11) &&
checkSubString (d[6], d[7], d[8], 13) &&
checkSubString (d[7], d[8], d[9], 17)) {
total += i;
}
}
}
return total;
};
const checkSubString = (d1, d2, d3, prime) => parseInt(`${d1}${d2}${d3}`) % prime === 0;
const isPandigital = num => {
var allNums = num.toString().split("").map(item => parseInt(item, 10)).sort();
for (var k = 0; k < allNums.length; k++) {
if (allNums[k] !== k) {
return false;
}
}
return true;
}
console.log(main()); // 16695334890
與其迭代范圍內的所有數字,不如只生成導致泛數字數字的排列,然后迭代它們呢? 這將減少很多計算:
從這個答案中調整置換函數:
const checkSubString = (d1, d2, d3, prime) => `${d1}${d2}${d3}` % prime === 0; const main = () => { let total = 0; const pandigitalNumbers = permut('1234567890').filter(char => char[0] !== '0'); for (const i of pandigitalNumbers) { var d = [...String(i)]; if (checkSubString(d[1], d[2], d[3], 2) && checkSubString(d[2], d[3], d[4], 3) && checkSubString(d[3], d[4], d[5], 5) && checkSubString(d[4], d[5], d[6], 7) && checkSubString(d[5], d[6], d[7], 11) && checkSubString(d[6], d[7], d[8], 13) && checkSubString(d[7], d[8], d[9], 17)) { total += Number(i); } } return total; }; console.log(main()); function permut(string) { const arr = []; if (string.length < 2) return string; for (let i = 0; i < string.length; i++) { const char = string[i]; if (!string.includes(char)) continue; const remainingString = string.slice(0, i) + string.slice(i + 1, string.length); for (var subPermutation of permut(remainingString)) arr.push(char + subPermutation) } return arr; }
上面的代碼片段在我的機器上運行大約 4 秒。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.