Complete practice algorithms from InterviewCake.com
While I've done these algorithms before, I'm preparing for an on-site with DeepMind, so I created a subdirectory called deepmind where I'm storing my second attempts at these problems. The idea of storing them in a second directory is to remove the urge to check my existing solutions that also exist in this repository.
This commit is contained in:
		
							parent
							
								
									a62553f7b7
								
							
						
					
					
						commit
						34dc3e05c8
					
				
					 3 changed files with 161 additions and 0 deletions
				
			
		
							
								
								
									
										51
									
								
								deepmind/inflight-entertainment.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								deepmind/inflight-entertainment.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,51 @@
 | 
				
			||||||
 | 
					import unittest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def can_two_movies_fill_flight(xs, t):
 | 
				
			||||||
 | 
					    seeking = set()
 | 
				
			||||||
 | 
					    for x in xs:
 | 
				
			||||||
 | 
					        if x in seeking:
 | 
				
			||||||
 | 
					            return True
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            seeking.add(t - x)
 | 
				
			||||||
 | 
					    return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Tests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Test(unittest.TestCase):
 | 
				
			||||||
 | 
					    def test_short_flight(self):
 | 
				
			||||||
 | 
					        result = can_two_movies_fill_flight([2, 4], 1)
 | 
				
			||||||
 | 
					        self.assertFalse(result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_long_flight(self):
 | 
				
			||||||
 | 
					        result = can_two_movies_fill_flight([2, 4], 6)
 | 
				
			||||||
 | 
					        self.assertTrue(result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_one_movie_half_flight_length(self):
 | 
				
			||||||
 | 
					        result = can_two_movies_fill_flight([3, 8], 6)
 | 
				
			||||||
 | 
					        self.assertFalse(result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_two_movies_half_flight_length(self):
 | 
				
			||||||
 | 
					        result = can_two_movies_fill_flight([3, 8, 3], 6)
 | 
				
			||||||
 | 
					        self.assertTrue(result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_lots_of_possible_pairs(self):
 | 
				
			||||||
 | 
					        result = can_two_movies_fill_flight([1, 2, 3, 4, 5, 6], 7)
 | 
				
			||||||
 | 
					        self.assertTrue(result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_not_using_first_movie(self):
 | 
				
			||||||
 | 
					        result = can_two_movies_fill_flight([4, 3, 2], 5)
 | 
				
			||||||
 | 
					        self.assertTrue(result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_only_one_movie(self):
 | 
				
			||||||
 | 
					        result = can_two_movies_fill_flight([6], 6)
 | 
				
			||||||
 | 
					        self.assertFalse(result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_no_movies(self):
 | 
				
			||||||
 | 
					        result = can_two_movies_fill_flight([], 2)
 | 
				
			||||||
 | 
					        self.assertFalse(result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unittest.main(verbosity=2)
 | 
				
			||||||
							
								
								
									
										59
									
								
								deepmind/merging-ranges.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								deepmind/merging-ranges.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,59 @@
 | 
				
			||||||
 | 
					import unittest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def merge_ranges(xs):
 | 
				
			||||||
 | 
					    xs.sort()
 | 
				
			||||||
 | 
					    result = [xs[0]]
 | 
				
			||||||
 | 
					    for curr in xs[1:]:
 | 
				
			||||||
 | 
					        a, z = result[-1]
 | 
				
			||||||
 | 
					        if z >= curr[0]:
 | 
				
			||||||
 | 
					            result[-1] = (a, max(z, curr[1]))
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            result.append(curr)
 | 
				
			||||||
 | 
					    return result
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Tests
 | 
				
			||||||
 | 
					class Test(unittest.TestCase):
 | 
				
			||||||
 | 
					    def test_meetings_overlap(self):
 | 
				
			||||||
 | 
					        actual = merge_ranges([(1, 3), (2, 4)])
 | 
				
			||||||
 | 
					        expected = [(1, 4)]
 | 
				
			||||||
 | 
					        self.assertEqual(actual, expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_meetings_touch(self):
 | 
				
			||||||
 | 
					        actual = merge_ranges([(5, 6), (6, 8)])
 | 
				
			||||||
 | 
					        expected = [(5, 8)]
 | 
				
			||||||
 | 
					        self.assertEqual(actual, expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_meeting_contains_other_meeting(self):
 | 
				
			||||||
 | 
					        actual = merge_ranges([(1, 8), (2, 5)])
 | 
				
			||||||
 | 
					        expected = [(1, 8)]
 | 
				
			||||||
 | 
					        self.assertEqual(actual, expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_meetings_stay_separate(self):
 | 
				
			||||||
 | 
					        actual = merge_ranges([(1, 3), (4, 8)])
 | 
				
			||||||
 | 
					        expected = [(1, 3), (4, 8)]
 | 
				
			||||||
 | 
					        self.assertEqual(actual, expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_multiple_merged_meetings(self):
 | 
				
			||||||
 | 
					        actual = merge_ranges([(1, 4), (2, 5), (5, 8)])
 | 
				
			||||||
 | 
					        expected = [(1, 8)]
 | 
				
			||||||
 | 
					        self.assertEqual(actual, expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_meetings_not_sorted(self):
 | 
				
			||||||
 | 
					        actual = merge_ranges([(5, 8), (1, 4), (6, 8)])
 | 
				
			||||||
 | 
					        expected = [(1, 4), (5, 8)]
 | 
				
			||||||
 | 
					        self.assertEqual(actual, expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_one_long_meeting_contains_smaller_meetings(self):
 | 
				
			||||||
 | 
					        actual = merge_ranges([(1, 10), (2, 5), (6, 8), (9, 10), (10, 12)])
 | 
				
			||||||
 | 
					        expected = [(1, 12)]
 | 
				
			||||||
 | 
					        self.assertEqual(actual, expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_sample_input(self):
 | 
				
			||||||
 | 
					        actual = merge_ranges([(0, 1), (3, 5), (4, 8), (10, 12), (9, 10)])
 | 
				
			||||||
 | 
					        expected = [(0, 1), (3, 8), (9, 12)]
 | 
				
			||||||
 | 
					        self.assertEqual(actual, expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unittest.main(verbosity=2)
 | 
				
			||||||
							
								
								
									
										51
									
								
								deepmind/stock-price.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								deepmind/stock-price.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,51 @@
 | 
				
			||||||
 | 
					def get_max_profit(xs):
 | 
				
			||||||
 | 
					    best_profit = xs[1] - xs[0]
 | 
				
			||||||
 | 
					    lowest_buy = xs[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for x in xs[1:]:
 | 
				
			||||||
 | 
					        best_profit = max(best_profit, x - lowest_buy)
 | 
				
			||||||
 | 
					        lowest_buy = min(lowest_buy, x)
 | 
				
			||||||
 | 
					    return best_profit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Tests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import unittest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Test(unittest.TestCase):
 | 
				
			||||||
 | 
					    def test_price_goes_up_then_down(self):
 | 
				
			||||||
 | 
					        actual = get_max_profit([1, 5, 3, 2])
 | 
				
			||||||
 | 
					        expected = 4
 | 
				
			||||||
 | 
					        self.assertEqual(actual, expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_price_goes_down_then_up(self):
 | 
				
			||||||
 | 
					        actual = get_max_profit([7, 2, 8, 9])
 | 
				
			||||||
 | 
					        expected = 7
 | 
				
			||||||
 | 
					        self.assertEqual(actual, expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_price_goes_up_all_day(self):
 | 
				
			||||||
 | 
					        actual = get_max_profit([1, 6, 7, 9])
 | 
				
			||||||
 | 
					        expected = 8
 | 
				
			||||||
 | 
					        self.assertEqual(actual, expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_price_goes_down_all_day(self):
 | 
				
			||||||
 | 
					        actual = get_max_profit([9, 7, 4, 1])
 | 
				
			||||||
 | 
					        expected = -2
 | 
				
			||||||
 | 
					        self.assertEqual(actual, expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_price_stays_the_same_all_day(self):
 | 
				
			||||||
 | 
					        actual = get_max_profit([1, 1, 1, 1])
 | 
				
			||||||
 | 
					        expected = 0
 | 
				
			||||||
 | 
					        self.assertEqual(actual, expected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_error_with_empty_prices(self):
 | 
				
			||||||
 | 
					        with self.assertRaises(Exception):
 | 
				
			||||||
 | 
					            get_max_profit([])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_error_with_one_price(self):
 | 
				
			||||||
 | 
					        with self.assertRaises(Exception):
 | 
				
			||||||
 | 
					            get_max_profit([1])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unittest.main(verbosity=2)
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue