【发布时间】:2018-10-06 19:41:22
【问题描述】:
我被分配了这个算法任务:
你将在下面输入一个三角形,你需要根据下面给定的规则找到数字的最大总和;
您将从顶部开始向下移动到相邻的数字,如下所示。
你只能沿着对角线向下走。
你只能走过非质数。
你必须尽可能到达金字塔的尽头。
1
8 4
2 6 9
8 5 9 3
如您所见,这有几条路径符合 NOT PRIME NUMBERS 规则; 1>8>6>9, 1>4>6>9, 1>4>9>9 1 + 8 + 6 + 9 = 24. 如你所见 1, 8, 6, 9 都不是质数并且走超过这些产生最大总和。
根据上面的规则,下面输入的最大总和是多少?这意味着请将此金字塔作为您的实现的输入(作为文件或直接在代码中的常量)并使用它来解决。
215
193 124
117 237 442
218 935 347 235
320 804 522 417 345
229 601 723 835 133 124
248 202 277 433 207 263 257
359 464 504 528 516 716 871 182
461 441 426 656 863 560 380 171 923
381 348 573 533 447 632 387 176 975 449
223 711 445 645 245 543 931 532 937 541 444
330 131 333 928 377 733 017 778 839 168 197 197
131 171 522 137 217 224 291 413 528 520 227 229 928
223 626 034 683 839 053 627 310 713 999 629 817 410 121
924 622 911 233 325 139 721 218 253 223 107 233 230 124 233
注意,这里每个节点只有两个孩子(除了最底层的)。例如,您可以从 215 走到 124(因为 193 是素数),然后从 124 走到 237 或 442。从 124 不能走到 117,因为它不是 124 的直系子代。
const isNotPrime = (num) => {
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i === 0) return true;
}
return false;
}
function maximumTrianglePathSum(triangle) {
function distilLastLine() {
let lastLine = triangle.pop(),
aboveLine = triangle.pop()
for (let i = 0; i < aboveLine.length; i++)
if(isNotPrime(lastLine[i]) && isNotPrime(lastLine[i + 1])){
aboveLine[i] = Math.max(
aboveLine[i] + lastLine[i],
aboveLine[i] + lastLine[i + 1]
)
}else if(isNotPrime(lastLine[i]) && !isNotPrime(lastLine[i + 1]) ) {
aboveLine[i] = aboveLine[i] + lastLine[i]
}else if(!isNotPrime(lastLine[i]) && isNotPrime(lastLine[i + 1]) ){
aboveLine[i] = aboveLine[i] + lastLine[i + 1]
}
triangle.push(aboveLine)
}
do {
distilLastLine()
} while (triangle.length > 1)
return triangle[0][0]
}
// testing
const myArray = [[1],
[8, 4],
[2, 6, 9],
[8, 5, 9, 3]]
let theTriangle = [[215],
[193, 124],
[117, 237, 442],
[218, 935, 347, 235],
[320, 804, 522, 417, 345],
[229, 601, 723, 835, 133, 124],
[248, 202, 277, 433, 207, 263, 257],
[359, 464, 504, 528, 516, 716, 871, 182],
[461, 441, 426, 656, 863, 560, 380, 171, 923],
[381, 348, 573, 533, 447, 632, 387, 176, 975, 449],
[223, 711, 445, 645, 245, 543, 931, 532, 937, 541, 444],
[330, 131, 333, 928, 377, 733, 17, 778, 839, 168, 197, 197],
[131, 171, 522, 137, 217, 224, 291, 413, 528, 520, 227, 229, 928],
[223, 626, 34, 683, 839, 53, 627, 310, 713, 999, 629, 817, 410, 121],
[924, 622, 911, 233, 325, 139, 721, 218, 253, 223, 107, 233, 230, 124, 233]]
console.log(maximumTrianglePathSum(myArray))
console.log(maximumTrianglePathSum(theTriangle))
所以实际上在第一个示例中它打印的是 23 而不是 24,并且最大路径是 24。
谁能帮我检查一下代码,看看有什么问题。
【问题讨论】:
-
第一:缓存
isNotPrime()的结果 -
第二:你忘了
lastLine[i-1] -
最后一行的放置位置[i-1]
标签: javascript arrays algorithm