WIP: Partially solve InterviewCake's find duplicate number
Write a function that finds one duplicate number from a list of numbers 1..n. The function should satisfy the following performance objectives: Runtime complexity: O(n*log(n)) Space complexity: O(1)
This commit is contained in:
		
							parent
							
								
									d408915cfd
								
							
						
					
					
						commit
						452a8fd4c7
					
				
					 1 changed files with 70 additions and 0 deletions
				
			
		|  | @ -0,0 +1,70 @@ | ||||||
|  | function findRepeatBruteForce(xs: Array<number>): number { | ||||||
|  |   // InterviewCake asks us to write a function that optimizes for space. Using
 | ||||||
|  |   // brute force, we can write a function that returns an answer using constant
 | ||||||
|  |   // (i.e. O(1)) space at the cost of a quadratic (i.e. O(n^2)) runtime.
 | ||||||
|  |   //
 | ||||||
|  |   // I did not think of this myself; InterviewCake's "Tell me more" hints
 | ||||||
|  |   // did. Since I think this idea is clever, I wrote a solution from memory to
 | ||||||
|  |   // help me internalize the solution.
 | ||||||
|  |   for (let i = 0; i < xs.length; i += 1) { | ||||||
|  |     let seeking = xs[i]; | ||||||
|  |     for (let j = i + 1; j < xs.length; j += 1) { | ||||||
|  |       if (xs[j] === seeking) { | ||||||
|  |         return seeking; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function findRepeatSort(xs: Array<number>): number { | ||||||
|  |   // This version first sorts xs, which gives the function a time-complexity of
 | ||||||
|  |   // O(n*log(n)), which is better than the quadratic complexity of the
 | ||||||
|  |   // brute-force solution. The space requirement here is constant.
 | ||||||
|  |   //
 | ||||||
|  |   // Since we need to sort xs in-place to avoid paying a O(n) space cost for
 | ||||||
|  |   // storing the newly sorted xs, we're mutating our input. InterviewCake
 | ||||||
|  |   // advises us to not mutate our input.
 | ||||||
|  |   xs.sort(); | ||||||
|  |   let i = 0; | ||||||
|  |   let j = 1; | ||||||
|  |   for (; j < xs.length; ) { | ||||||
|  |     if (xs[i] === xs[j]) { | ||||||
|  |       return xs[i]; | ||||||
|  |     } | ||||||
|  |     i += 1; | ||||||
|  |     j += 1; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function findRepeat(xs: Array<number>): number { | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Tests
 | ||||||
|  | let desc = "just the repeated number"; | ||||||
|  | let actual = findRepeat([1, 1]); | ||||||
|  | let expected = 1; | ||||||
|  | assertEqual(actual, expected, desc); | ||||||
|  | 
 | ||||||
|  | desc = "short array"; | ||||||
|  | actual = findRepeat([1, 2, 3, 2]); | ||||||
|  | expected = 2; | ||||||
|  | assertEqual(actual, expected, desc); | ||||||
|  | 
 | ||||||
|  | desc = "medium array"; | ||||||
|  | actual = findRepeat([1, 2, 5, 5, 5, 5]); | ||||||
|  | expected = 5; | ||||||
|  | assertEqual(actual, expected, desc); | ||||||
|  | 
 | ||||||
|  | desc = "long array"; | ||||||
|  | actual = findRepeat([4, 1, 4, 8, 3, 2, 7, 6, 5]); | ||||||
|  | expected = 4; | ||||||
|  | assertEqual(actual, expected, desc); | ||||||
|  | 
 | ||||||
|  | function assertEqual(a, b, desc) { | ||||||
|  |   if (a === b) { | ||||||
|  |     console.log(`${desc} ... PASS`); | ||||||
|  |   } else { | ||||||
|  |     console.log(`${desc} ... FAIL: ${a} != ${b}`); | ||||||
|  |   } | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue