From 58ed992059aeeee3fc4320821f052d7f412aed2e Mon Sep 17 00:00:00 2001 From: William Carroll Date: Mon, 9 Mar 2020 17:13:26 +0000 Subject: [PATCH] Solve InterviewCake's "find rotation point" problem Write a function that accepts a rotated cycle of alphabetically sorted strings and returns the index what should be the first element if the elements were not rotated. --- .../deepmind/part_two/find-rotation-point.ts | 68 +++++++++++++++++++ scratch/deepmind/part_two/todo.org | 2 +- 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 scratch/deepmind/part_two/find-rotation-point.ts diff --git a/scratch/deepmind/part_two/find-rotation-point.ts b/scratch/deepmind/part_two/find-rotation-point.ts new file mode 100644 index 000000000..7bf1a4844 --- /dev/null +++ b/scratch/deepmind/part_two/find-rotation-point.ts @@ -0,0 +1,68 @@ +function findRotationPoint(xs: Array): number { + // Find the rotation point in the vector. + let beg = 0; + let end = xs.length - 1; + + while (beg != end) { + let mid = beg + Math.floor((end - beg) / 2); + + if (beg === mid) { + return xs[beg] < xs[end] ? beg : end; + } + + if (xs[end] <= xs[mid]) { + beg = mid; + end = end; + } else { + beg = beg; + end = mid; + } + } + + return beg; +} + +// Tests +let desc; +let actual; +let expected; + +desc = "small array one"; +actual = findRotationPoint(["cape", "cake"]); +expected = 1; +assertEquals(actual, expected, desc); + +desc = "small array two"; +actual = findRotationPoint(["cake", "cape"]); +expected = 0; +assertEquals(actual, expected, desc); + +desc = "medium array"; +actual = findRotationPoint(["grape", "orange", "plum", "radish", "apple"]); +expected = 4; +assertEquals(actual, expected, desc); + +desc = "large array"; +actual = findRotationPoint([ + "ptolemaic", + "retrograde", + "supplant", + "undulate", + "xenoepist", + "asymptote", + "babka", + "banoffee", + "engender", + "karpatka", + "othellolagkage" +]); +expected = 5; +assertEquals(actual, expected, desc); + +function assertEquals(a, b, desc) { + if (a === b) { + console.log(`${desc} ... PASS`); + } else { + console.log(`${desc} ... FAIL: ${a} != ${b}`); + } +} diff --git a/scratch/deepmind/part_two/todo.org b/scratch/deepmind/part_two/todo.org index 228dd08ef..aeb890de5 100644 --- a/scratch/deepmind/part_two/todo.org +++ b/scratch/deepmind/part_two/todo.org @@ -16,7 +16,7 @@ ** DONE Cafe Order Checker ** DONE In-Place Shuffle * Sorting, searching, and logarithms -** TODO Find Rotation Point +** DONE Find Rotation Point ** TODO Find Repeat, Space Edition ** TODO Top Scores ** TODO Merging Meeting Times