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…
	
	Add table
		Add a link
		
	
		Reference in a new issue