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:
parent
b929a6bb57
commit
58ed992059
2 changed files with 69 additions and 1 deletions
68
scratch/deepmind/part_two/find-rotation-point.ts
Normal file
68
scratch/deepmind/part_two/find-rotation-point.ts
Normal 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}`);
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue