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.
This commit is contained in:
William Carroll 2020-03-09 17:13:26 +00:00
parent b929a6bb57
commit 58ed992059
2 changed files with 69 additions and 1 deletions

View file

@ -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}`);
}
}

View file

@ -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