58ed992059
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.
68 lines
1.3 KiB
TypeScript
68 lines
1.3 KiB
TypeScript
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}`);
|
|
}
|
|
}
|