-
Notifications
You must be signed in to change notification settings - Fork 0
/
ex-5-2-PassingCars.py
134 lines (99 loc) · 4.02 KB
/
ex-5-2-PassingCars.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
"""
Passing Cars
Count the number of passing cars on the road.
***
Note:
The cars travelling east only pass cars travelling west if they appear after it in the series.
The only indication of this feature is the example. And even when I started to suspect it, there is
no second example with which to establish whether this observation is a feature or a coincidence.
* you can invert the problem to a count of cars travelling east that pass cars travelling west no problem.
********
A non-empty zero-indexed array A consisting of N integers is given. The consecutive elements of array A represent consecutive cars on a road.
Array A contains only 0s and/or 1s:
0 represents a car traveling east,
1 represents a car traveling west.
The goal is to count passing cars. We say that a pair of cars (P, Q), where 0 <= P < Q < N, is passing when P is
traveling to the east and Q is traveling to the west.
For example, consider array A such that:
A[0] = 0
A[1] = 1
A[2] = 0
A[3] = 1
A[4] = 1
We have five pairs of passing cars: (0, 1), (0, 3), (0, 4), (2, 3), (2, 4).
Write a function:
int solution(int A[], int N);
that, given a non-empty zero-indexed array A of N integers, returns the number of pairs of passing cars.
The function should return -1 if the number of pairs of passing cars exceeds 1,000,000,000.
For example, given:
A[0] = 0
A[1] = 1
A[2] = 0
A[3] = 1
A[4] = 1
the function should return 5, as explained above.
Assume that:
N is an integer within the range [1..100,000];
each element of array A is an integer that can have one of the following values: 0, 1.
Complexity:
expected worst-case time complexity is O(N);
expected worst-case space complexity is O(1), beyond input storage (not counting the storage required for input arguments).
Elements of input arrays can be modified.
"""
import unittest
import random
MAX_INT = int(100000)
MAX_PAIRS = int(1e9)
def solution(A):
"""
:param A: array of int (0 or 1 which are actually booleans)
:return: integer count of pairs of passing cars, or -1 if more than 1e9 pairs
"""
east = 0
pairs = 0
for car in A:
if not bool(car):
east += 1
else:
pairs += east
if pairs > MAX_PAIRS:
return -1
return pairs
class TestExercise(unittest.TestCase):
def test_example(self):
self.assertEqual(solution([0, 1, 0, 1, 1]), 5)
def test_minimal(self):
self.assertEqual(solution([0]), 0)
self.assertEqual(solution([1]), 0)
self.assertEqual(solution([0, 0]), 0)
self.assertEqual(solution([1, 1]), 0)
self.assertEqual(solution([0, 1]), 1)
self.assertEqual(solution([1, 0]), 0)
def test_three(self):
self.assertEqual(solution([0, 0, 0]), 0)
self.assertEqual(solution([0, 0, 1]), 2)
self.assertEqual(solution([0, 1, 0]), 1)
self.assertEqual(solution([0, 1, 1]), 2)
self.assertEqual(solution([1, 0, 0]), 0)
self.assertEqual(solution([1, 0, 1]), 1)
self.assertEqual(solution([1, 1, 0]), 0)
self.assertEqual(solution([1, 1, 1]), 0)
def test_four(self):
self.assertEqual(solution([0, 0, 0, 0]), 0)
self.assertEqual(solution([0, 0, 0, 1]), 3)
self.assertEqual(solution([0, 0, 1, 1]), 4)
self.assertEqual(solution([0, 1, 0, 0]), 1)
self.assertEqual(solution([0, 1, 0, 1]), 3)
self.assertEqual(solution([0, 1, 1, 1]), 3)
self.assertEqual(solution([1, 0, 0, 0]), 0)
self.assertEqual(solution([1, 0, 0, 1]), 2)
self.assertEqual(solution([1, 0, 1, 0]), 1)
self.assertEqual(solution([1, 0, 1, 1]), 2)
self.assertEqual(solution([1, 1, 0, 0]), 0)
self.assertEqual(solution([1, 1, 0, 1]), 1)
self.assertEqual(solution([1, 1, 1, 0]), 0)
self.assertEqual(solution([1, 1, 1, 1]), 0)
def test_extreme(self):
self.assertEqual(solution([random.randint(0,1) for _ in xrange(int(1e6))]), -1)
if __name__ == '__main__':
unittest.main()