diff options
author | William Carroll <wpcarro@gmail.com> | 2020-03-09T17·13+0000 |
---|---|---|
committer | William Carroll <wpcarro@gmail.com> | 2020-03-10T13·27+0000 |
commit | 58ed992059aeeee3fc4320821f052d7f412aed2e (patch) | |
tree | cd44b942da39a05270c759c61000f116eecb9416 /scratch/deepmind/part_two/find-rotation-point.ts | |
parent | b929a6bb57a3e57e5bdacb12146bb28a57579f9c (diff) |
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.
Diffstat (limited to 'scratch/deepmind/part_two/find-rotation-point.ts')
-rw-r--r-- | scratch/deepmind/part_two/find-rotation-point.ts | 68 |
1 files changed, 68 insertions, 0 deletions
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 000000000000..7bf1a484454d --- /dev/null +++ b/scratch/deepmind/part_two/find-rotation-point.ts @@ -0,0 +1,68 @@ +function findRotationPoint(xs: Array<string>): 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}`); + } +} |