Adding a test in problem-14-Longest-collatz-sequence.english.md (#38401)
* Adding a test in problem-14-Longest-collatz-sequence.english.md Adding a test in problem-14-Longest-collatz-sequence.english.md * fix(curriculum): use more efficient algorithm Co-authored-by: Oliver Eyton-Williams <ojeytonwilliams@gmail.com>
This commit is contained in:
@ -48,6 +48,8 @@ tests:
|
|||||||
testString: assert.strictEqual(longestCollatzSequence(54512), 52527);
|
testString: assert.strictEqual(longestCollatzSequence(54512), 52527);
|
||||||
- text: <code>longestCollatzSequence(100000)</code> should return 77031.
|
- text: <code>longestCollatzSequence(100000)</code> should return 77031.
|
||||||
testString: assert.strictEqual(longestCollatzSequence(100000), 77031);
|
testString: assert.strictEqual(longestCollatzSequence(100000), 77031);
|
||||||
|
- text: <code>longestCollatzSequence(1000000)</code> should return 837799.
|
||||||
|
testString: assert.strictEqual(longestCollatzSequence(1000000), 837799);
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -79,33 +81,28 @@ longestCollatzSequence(14);
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
function longestCollatzSequence(limit) {
|
function longestCollatzSequence(limit) {
|
||||||
let longestSequenceLength = 0;
|
let longest = 1;
|
||||||
let startingNum = 0;
|
let maxLength = 1;
|
||||||
|
for (let i = Math.floor(limit / 2); i < limit; i++) {
|
||||||
function sequenceLength(num) {
|
let len = colLen(i);
|
||||||
let length = 1;
|
if (len > maxLength) {
|
||||||
|
longest = i;
|
||||||
while (num >= 1) {
|
maxLength = len;
|
||||||
if (num === 1) { break;
|
|
||||||
} else if (num % 2 === 0) {
|
|
||||||
num = num / 2;
|
|
||||||
length++;
|
|
||||||
} else {
|
|
||||||
num = num * 3 + 1;
|
|
||||||
length++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 2; i < limit; i++) {
|
|
||||||
let currSequenceLength = sequenceLength(i);
|
|
||||||
if (currSequenceLength > longestSequenceLength) {
|
|
||||||
longestSequenceLength = currSequenceLength;
|
|
||||||
startingNum = i;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return startingNum;
|
return longest;
|
||||||
|
}
|
||||||
|
|
||||||
|
const knownSequence = { '1': 1 };
|
||||||
|
|
||||||
|
function colLen(n) {
|
||||||
|
if (knownSequence[n]) {
|
||||||
|
return knownSequence[n];
|
||||||
|
} else {
|
||||||
|
const len = n % 2 === 0 ? colLen(n / 2) + 1 : colLen((3 * n + 1) / 2) + 2;
|
||||||
|
knownSequence[n] = len;
|
||||||
|
return len;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user