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