[英]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.