From be6b609ac25a5a605967bd1f630c6c06259e0dfc Mon Sep 17 00:00:00 2001 From: Leo Lam Date: Fri, 20 Dec 2019 17:28:25 -0800 Subject: [PATCH] finish sc --- names/binary_search_tree.py | 39 ++++++++++++++++++++++++++ names/names.py | 14 ++++++++-- reverse/reverse.py | 55 +++++++++++++++++++++++++++++++++++-- ring_buffer/ring_buffer.py | 25 +++++++++++++++-- 4 files changed, 126 insertions(+), 7 deletions(-) create mode 100644 names/binary_search_tree.py diff --git a/names/binary_search_tree.py b/names/binary_search_tree.py new file mode 100644 index 000000000..1acd319eb --- /dev/null +++ b/names/binary_search_tree.py @@ -0,0 +1,39 @@ +class BinarySearchTree: + def __init__(self, value): + self.value = value + self.left = None + self.right = None + + def insert(self, value): + if (self.value == None): + self.value = BinarySearchTree(value) + elif (value < self.value): + if (self.left == None): + self.left = BinarySearchTree(value) + else: + self.left.insert(value) + else: + if (self.right == None): + self.right = BinarySearchTree(value) + else: + self.right.insert(value) + + + def contains(self, target): + if (self.value == target): + return True + elif (target < self.value and self.left != None): + return self.left.contains(target) + elif (self.right != None): + return self.right.contains(target) + else: + return False + + + def get_max(self): + max = self.value + p = self.right + while (p != None): + max = p.value + p = p.right + return max diff --git a/names/names.py b/names/names.py index 96a8b1a17..6654e2bb3 100644 --- a/names/names.py +++ b/names/names.py @@ -1,4 +1,5 @@ import time +from binary_search_tree import BinarySearchTree start_time = time.time() @@ -11,10 +12,17 @@ f.close() duplicates = [] +# for name_1 in names_1: +# for name_2 in names_2: +# if name_1 == name_2: +# duplicates.append(name_1) + +bst = BinarySearchTree(names_1[0]) for name_1 in names_1: - for name_2 in names_2: - if name_1 == name_2: - duplicates.append(name_1) + bst.insert(name_1) +for name_2 in names_2: + if bst.contains(name_2): + duplicates.append(name_2) end_time = time.time() print (f"{len(duplicates)} duplicates:\n\n{', '.join(duplicates)}\n\n") diff --git a/reverse/reverse.py b/reverse/reverse.py index 95ed9d1d4..668928812 100644 --- a/reverse/reverse.py +++ b/reverse/reverse.py @@ -5,6 +5,7 @@ def __init__(self, value=None, next_node=None): # reference to the next node in the list self.next_node = next_node + def get_value(self): return self.value @@ -19,6 +20,7 @@ class LinkedList: def __init__(self): # reference to the head of the list self.head = None + self.length = 0 def add_to_head(self, value): node = Node(value) @@ -26,6 +28,8 @@ def add_to_head(self, value): node.set_next(self.head) self.head = node + self.length += 1 + def contains(self, value): if not self.head: @@ -42,6 +46,53 @@ def contains(self, value): # if we've gotten here, then the target node isn't in our list return False + def print_self(self): + print("debug") + node = self.head + while node is not None: + print(node.get_value()) + node = node.get_next() + def reverse_list(self): - # TO BE COMPLETED - pass \ No newline at end of file + if self.length == 0 or self.length == 1: + return + + # break the list + old_head = self.head + old_head_next = self.head.get_next() + + old_head.set_next(None) + self.length = 1 + node = old_head_next + while node is not None: + _node = node.get_next() + # print('node',node.get_value()) + self.add_to_head(node.get_value()) + node = _node + # if node: + # print('node',node.get_value()) + # self.print_self() + + + # # find the node to insert, start with tail + # node_to_move = self.head + # for _ in range(self.length-1): + # node_to_move = node_to_move.get_next() + # node_to_insert = node_to_move + # print("node_to_insert", node_to_insert.get_value()) + # + # # move nodes + # for _ in range(self.length): + # node_to_move = self.head + # self.head = self.head.get_next() # save the head + # print("node_to_move", node_to_move.get_value()) + # print("node_to_insert", node_to_insert.get_value()) + # node_to_insert.set_next(node_to_move) + # node_to_insert = node_to_move + # node_to_move.set_next(None) + # # node_to_move = node_to_move.get_next() + + #debug + + + diff --git a/ring_buffer/ring_buffer.py b/ring_buffer/ring_buffer.py index ef88f0d6b..ebc44405c 100644 --- a/ring_buffer/ring_buffer.py +++ b/ring_buffer/ring_buffer.py @@ -4,17 +4,38 @@ class RingBuffer: def __init__(self, capacity): self.capacity = capacity - self.current = None + self.current = None # current oldest node self.storage = DoublyLinkedList() def append(self, item): - pass + + + + # check current size, if below capacity, append, if equal capacity, remove oldest (the head), and add to tail + if self.storage.length < self.capacity: + self.storage.add_to_tail(item) + else: + # overwrite current pointer + self.current.value = item + # increment the pointer + if self.current is not self.storage.tail: + self.current = self.current.next + else: + self.current = self.storage.head + + if self.storage.length == 1: + self.current = self.storage.head def get(self): # Note: This is the only [] allowed list_buffer_contents = [] # TODO: Your code here + item = self.storage.head + while item != None: + list_buffer_contents.append(item.value) + item = item.next + return list_buffer_contents