Solve "find duplicate" using a graph
This problem is unusually difficult, but the solution is elegant.
This commit is contained in:
		
							parent
							
								
									847aad2a14
								
							
						
					
					
						commit
						0ccaa22032
					
				
					 1 changed files with 57 additions and 0 deletions
				
			
		
							
								
								
									
										57
									
								
								scratch/facebook/find-duplicate-beast-mode.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								scratch/facebook/find-duplicate-beast-mode.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,57 @@ | |||
| def advance(position, xs): | ||||
|     """ | ||||
|     Return the next element in `xs` pointed to by the current `position`. | ||||
|     """ | ||||
|     return xs[position - 1] | ||||
| 
 | ||||
| def find_duplicate(xs): | ||||
|     """ | ||||
|     Find the duplicate integer in the list, `xs`. | ||||
|     """ | ||||
|     beg = xs[-1] | ||||
|     a = beg | ||||
|     b = advance(a, xs) | ||||
|     # Find the first element of the cycle | ||||
|     cycle_beg = None | ||||
|     while a != b: | ||||
|         cycle_beg = a | ||||
|         a = advance(a, xs) | ||||
|         b = advance(b, xs) | ||||
|         b = advance(b, xs) | ||||
|     # The duplicate element is the element before the `cycle_beg` | ||||
|     a = beg | ||||
|     result = None | ||||
|     while a != cycle_beg: | ||||
|         result = a | ||||
|         a = advance(a, xs) | ||||
|     return result | ||||
| 
 | ||||
| def find_duplicate(xs): | ||||
|     """ | ||||
|     This is the solution that InterviewCake.com suggests. | ||||
|     """ | ||||
|     # find length of the cycle | ||||
|     beg = xs[-1] | ||||
|     a = beg | ||||
|     for _ in range(len(xs)): | ||||
|         a = advance(a, xs) | ||||
|     element = a | ||||
|     a = advance(a, xs) | ||||
|     n = 1 | ||||
|     while a != element: | ||||
|         a = advance(a, xs) | ||||
|         n += 1 | ||||
|     # find the first element in the cycle | ||||
|     a, b = beg, beg | ||||
|     for _ in range(n): | ||||
|         b = advance(b, xs) | ||||
|     while a != b: | ||||
|         a = advance(a, xs) | ||||
|         b = advance(b, xs) | ||||
|     return a | ||||
| 
 | ||||
| xs = [2, 3, 1, 3] | ||||
| result = find_duplicate(xs) | ||||
| print(result) | ||||
| assert result == 3 | ||||
| print("Success!") | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue