-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbite_181.py
More file actions
83 lines (68 loc) · 1.9 KB
/
bite_181.py
File metadata and controls
83 lines (68 loc) · 1.9 KB
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
"""
Bite_181 keep list sorted upon insert.
"""
class OrderedList:
"""OrderedList
"""
def __init__(self):
self._numbers = []
def __str__(self):
return ", ".join(str(num) for num in self._numbers)
def add(self, num: int):
"""add - add values to ordered list
Parameters
----------
num: int
value to be added
"""
if not self._numbers:
self._numbers.append(num)
else:
idx = self._bsearch(num)
self._numbers.insert(idx, num)
# check
ok = self._is_inorder()
if not ok:
raise Exception("rule broken as list is not in order!")
def _is_inorder(self) -> bool:
"""_is_inorder - check ordered list is in order!
Returns
-------
bool:
is in order or not
"""
return all(self._numbers[i] <= self._numbers[i+1] for i in range(len(self._numbers)-1)) or all(self._numbers[i] >= self._numbers[i+1] for i in range(len(self._numbers)-1))
def _bsearch(self, num: int) -> int:
"""_bsearch
Parameters
----------
num: int
value
Returns
-------
int:
idx
"""
size = len(self._numbers)
high = size
low = 0
while low <= high:
mid = (high + low) // 2
if mid < size:
# same value
if self._numbers[mid] == num:
return mid
# high/low
if num < self._numbers[mid]:
high = mid - 1
else:
low = mid + 1
else:
break
# just return lowest idx
return low
if __name__ == "__main__":
order = OrderedList()
for num in [10, 9, 16, 2, 7, 1, 5]:
order.add(num)
print(order)