File tree 6 files changed +93
-0
lines changed
6 files changed +93
-0
lines changed Original file line number Diff line number Diff line change 25
25
- [x] [ Challenge 23: Invert a binary tree] ( challenge-23/ )
26
26
- [x] [ Challenge 24: Move zeros] ( challenge-24/ )
27
27
- [x] [ Challenge 25: Falling Dominoes] ( challenge-25/ )
28
+ - [x] [ Challenge 26: Course Pre-requisites] ( challenge-26/ )
Original file line number Diff line number Diff line change
1
+ test :
2
+ python test_* .py
3
+
4
+ .PHONY : test
Original file line number Diff line number Diff line change
1
+ # Course Pre-requisites
2
+
3
+ This problem was asked by Google.
4
+
5
+ ## Description
6
+
7
+ You are given a hash table where the key is a course code, and the value is a list of all the course codes that are prerequisites for the key.
8
+
9
+ Return a valid ordering in which we can complete the courses.
10
+
11
+ If no such ordering exists, return NULL.
12
+
13
+ ## Example
14
+
15
+ ```
16
+ Input:
17
+ {
18
+ 'CSC300': ['CSC100', 'CSC200'],
19
+ 'CSC200': ['CSC100'],
20
+ 'CSC100': []
21
+ }
22
+
23
+ Output: ['CSC100', 'CSC200', 'CSC300']
24
+ ```
Original file line number Diff line number Diff line change
1
+ def courses_to_take (input ):
2
+ """
3
+ Time complexity: O(n) (we process each course only once)
4
+ Space complexity: O(n) (array to store the result)
5
+ """
6
+ # Normalize the dependencies, using a set to track the
7
+ # dependencies more efficiently
8
+ course_with_deps = {}
9
+ to_take = []
10
+
11
+ for course , deps in input .items ():
12
+ if not deps :
13
+ # Course with no dependencies:
14
+ # candidate to start the search
15
+ to_take .append (course )
16
+ else :
17
+ course_with_deps [course ] = set (deps )
18
+
19
+ result = []
20
+ while to_take :
21
+ course = to_take .pop ()
22
+
23
+ # Add course to journey
24
+ result .append (course )
25
+
26
+ # Iterate through courses and remove this course from
27
+ # dependencies
28
+ for prereq_course , prereq_deps in course_with_deps .items ():
29
+ if course in prereq_deps :
30
+ prereq_deps .remove (course )
31
+
32
+ if not prereq_deps :
33
+ # Course has all the dependencies solved:
34
+ # add to the "to_take" queue
35
+ to_take .append (prereq_course )
36
+ del course_with_deps [prereq_course ]
37
+
38
+ return result if len (result ) == len (input ) else None
Original file line number Diff line number Diff line change
1
+ import unittest
2
+ from solver import courses_to_take
3
+
4
+ class TestSolver (unittest .TestCase ):
5
+ def test_courses_to_take (self ):
6
+ self .assertEqual (
7
+ courses_to_take ({
8
+ 'CSC300' : ['CSC100' , 'CSC200' ],
9
+ 'CSC200' : ['CSC100' ],
10
+ 'CSC100' : []
11
+ }),
12
+ ['CSC100' , 'CSC200' , 'CSC300' ]
13
+ )
14
+
15
+ self .assertEqual (
16
+ courses_to_take ({
17
+ 'CSC400' : ['CSC300' , 'CSC200' ],
18
+ 'CSC300' : ['CSC200' ],
19
+ 'CSC200' : ['CSC300' , 'CSC100' ],
20
+ 'CSC100' : []
21
+ }),
22
+ None
23
+ )
24
+
25
+ if __name__ == "__main__" :
26
+ unittest .main ()
You can’t perform that action at this time.
0 commit comments