WIP: Partially solve InterviewCake's find duplicate number
Write a function that finds one duplicate number from a list of numbers 1..n. The function should satisfy the following performance objectives: Runtime complexity: O(n*log(n)) Space complexity: O(1)
This commit is contained in:
parent
d408915cfd
commit
452a8fd4c7
1 changed files with 70 additions and 0 deletions
|
@ -0,0 +1,70 @@
|
|||
function findRepeatBruteForce(xs: Array<number>): number {
|
||||
// InterviewCake asks us to write a function that optimizes for space. Using
|
||||
// brute force, we can write a function that returns an answer using constant
|
||||
// (i.e. O(1)) space at the cost of a quadratic (i.e. O(n^2)) runtime.
|
||||
//
|
||||
// I did not think of this myself; InterviewCake's "Tell me more" hints
|
||||
// did. Since I think this idea is clever, I wrote a solution from memory to
|
||||
// help me internalize the solution.
|
||||
for (let i = 0; i < xs.length; i += 1) {
|
||||
let seeking = xs[i];
|
||||
for (let j = i + 1; j < xs.length; j += 1) {
|
||||
if (xs[j] === seeking) {
|
||||
return seeking;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function findRepeatSort(xs: Array<number>): number {
|
||||
// This version first sorts xs, which gives the function a time-complexity of
|
||||
// O(n*log(n)), which is better than the quadratic complexity of the
|
||||
// brute-force solution. The space requirement here is constant.
|
||||
//
|
||||
// Since we need to sort xs in-place to avoid paying a O(n) space cost for
|
||||
// storing the newly sorted xs, we're mutating our input. InterviewCake
|
||||
// advises us to not mutate our input.
|
||||
xs.sort();
|
||||
let i = 0;
|
||||
let j = 1;
|
||||
for (; j < xs.length; ) {
|
||||
if (xs[i] === xs[j]) {
|
||||
return xs[i];
|
||||
}
|
||||
i += 1;
|
||||
j += 1;
|
||||
}
|
||||
}
|
||||
|
||||
function findRepeat(xs: Array<number>): number {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Tests
|
||||
let desc = "just the repeated number";
|
||||
let actual = findRepeat([1, 1]);
|
||||
let expected = 1;
|
||||
assertEqual(actual, expected, desc);
|
||||
|
||||
desc = "short array";
|
||||
actual = findRepeat([1, 2, 3, 2]);
|
||||
expected = 2;
|
||||
assertEqual(actual, expected, desc);
|
||||
|
||||
desc = "medium array";
|
||||
actual = findRepeat([1, 2, 5, 5, 5, 5]);
|
||||
expected = 5;
|
||||
assertEqual(actual, expected, desc);
|
||||
|
||||
desc = "long array";
|
||||
actual = findRepeat([4, 1, 4, 8, 3, 2, 7, 6, 5]);
|
||||
expected = 4;
|
||||
assertEqual(actual, expected, desc);
|
||||
|
||||
function assertEqual(a, b, desc) {
|
||||
if (a === b) {
|
||||
console.log(`${desc} ... PASS`);
|
||||
} else {
|
||||
console.log(`${desc} ... FAIL: ${a} != ${b}`);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue