From 8aca11b1714652890e89b09b857c6b99c014f389 Mon Sep 17 00:00:00 2001 From: bt3 Date: Sun, 25 Oct 2015 20:15:48 -0700 Subject: [PATCH] warmup, preparing to give interviews --- short_phone_interview_problems/balanced.py | 22 +++ short_phone_interview_problems/bst.py | 165 +++++++++++++++++++++ short_phone_interview_problems/queue.py | 47 ++++++ short_phone_interview_problems/stack.py | 40 +++++ 4 files changed, 274 insertions(+) create mode 100644 short_phone_interview_problems/balanced.py create mode 100644 short_phone_interview_problems/bst.py create mode 100644 short_phone_interview_problems/queue.py create mode 100644 short_phone_interview_problems/stack.py diff --git a/short_phone_interview_problems/balanced.py b/short_phone_interview_problems/balanced.py new file mode 100644 index 0000000..760316d --- /dev/null +++ b/short_phone_interview_problems/balanced.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +__author__ = "bt3" + + +def balance_par_str_with_stack(str1): + i, stack = 0, [] + + while i < len(str1): + symbol = str1[i] + if symbol == "(": + stack.append(symbol) + elif symbol == ")": + stack.pop() + i += 1 + return not stack + + + +if __name__ == '__main__': + print(balance_par_str_with_stack('((()))')) + print(balance_par_str_with_stack('(()')) \ No newline at end of file diff --git a/short_phone_interview_problems/bst.py b/short_phone_interview_problems/bst.py new file mode 100644 index 0000000..f908e10 --- /dev/null +++ b/short_phone_interview_problems/bst.py @@ -0,0 +1,165 @@ +#!/usr/bin/python + +__author__ = "bt3" + +from collections import deque + +class Node(object): + + def __init__(self, item=None): + + self.item = item + self.left = None + self.right = None + + + def _add(self, value): + new_node = Node(value) + if not self.item: + self.item = new_node + else: + if value > self.item: + self.right = self.right and self.right._add(value) or new_node + elif value < self.item: + self.left = self.left and self.left._add(value) or new_node + else: + print("BSTs do not support repeated items.") + return self + + + def _search(self, value): + if self.item == value: + return True + elif self.left and value < self.item: + return self.left._search(value) + elif self.right and value > self.item: + return self.right._search(value) + else: + return False + + + def _isLeaf(self): + return not self.right and not self.left + + + def _printPreorder(self): + print self.item + + if self.left: + self.left._printPreorder() + + if self.right: + self.right._printPreorder() + + + def _preorder_array(self): + nodes = [] + if self.item: + nodes.append(self.item) + if self.left: + nodes.extend(self.left._preorder_array()) + if self.right: + nodes.extend(self.right._preorder_array()) + return nodes + + + +class BST(object): + + def __init__(self): + self.root = None + + def add(self, value): + if not self.root: + self.root = Node(value) + else: + self.root._add(value) + + def printPreorder(self): + if self.root: + self.root._printPreorder() + + def search(self, value): + if self.root: + return self.root._search(value) + + def preorder_array(self): + if self.root: + return self.root._preorder_array() + else: + return 'Tree is empty.' + + + + +def BFT(tree): + current = tree.root + nodes = [] + queue = deque() + queue.append(current) + + while queue: + current = queue.popleft() + nodes.append(current.item) + if current.left: + queue.append(current.left) + if current.right: + queue.append(current.right) + + return nodes + + +def preorder(tree, nodes=None): + nodes = nodes or [] + if tree: + nodes.append(tree.item) + if tree.left: + preorder(tree.left, nodes) + if tree.right: + preorder(tree.right, nodes) + return nodes + + +def postorder(tree, nodes=None): + nodes = nodes or [] + if tree: + if tree.left: + nodes = postorder(tree.left, nodes) + if tree.right: + nodes = postorder(tree.right, nodes) + nodes.append(tree.item) + + return nodes + + +def inorder(tree, nodes=None): + nodes = nodes or [] + if tree: + if tree.left: + nodes = inorder(tree.left, nodes) + nodes.append(tree.item) + if tree.right: + nodes = inorder(tree.right, nodes) + return nodes + + + + +if __name__ == '__main__': + bst = BST() + l = [10, 5, 6, 3, 8, 2, 1, 11, 9, 4] + for i in l: + bst.add(i) + + print + print "Searching for nodes 16 and 6:" + print bst.search(16) + print bst.search(6) + + print + print 'Traversals:' + print 'Original: ', l + print 'Preorder: ', preorder(bst.root) + print 'Postorder: ', postorder(bst.root) + print 'Inorder: ', inorder(bst.root) + print 'BSF: ', BFT(bst) \ No newline at end of file diff --git a/short_phone_interview_problems/queue.py b/short_phone_interview_problems/queue.py new file mode 100644 index 0000000..c2ec415 --- /dev/null +++ b/short_phone_interview_problems/queue.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +__author__ = "bt3" + + +class Queue(object): + def __init__(self): + self.enq = [] + self.deq = [] + + def enqueue(self, item): + return self.enq.append(item) + + def deque(self): + if not self.deq: + while self.enq: + self.deq.append(self.enq.pop()) + return self.deq.pop() + + def peak(self): + if not self.deq: + while self.enq: + self.deq.append(self.enq.pop()) + if self.deq: + return self.deq[-1] + + def size(self): + return len(self.enq) + len(self.deq) + + def isempty(self): + return not (self.enq + self.deq) + + +if __name__ == '__main__': + q = Queue() + for i in range(1,11): + q.enqueue(i) + print 'Size:', q.size() + print 'Is empty?', q.isempty() + print 'Peak: ', q.peak() + print + print 'Dequeuing...' + for i in range(10): + print q.deque() + print 'Size:', q.size() + print 'Is empty?', q.isempty() + print 'Peak: ', q.peak() \ No newline at end of file diff --git a/short_phone_interview_problems/stack.py b/short_phone_interview_problems/stack.py new file mode 100644 index 0000000..07e9e06 --- /dev/null +++ b/short_phone_interview_problems/stack.py @@ -0,0 +1,40 @@ + +#!/usr/bin/env python + +__author__ = "bt3" + + +class Stack(object): + def __init__(self): + self.content = [] + + def push(self, value): + self.content.append(value) + + def pop(self): + if self.content: + return self.content.pop() + else: + return 'Empty List. ' + + def size(self): + return len(self.content) + + def isEmpty(self): + return not bool(self.content) + + def peek(self): + if self.content: + return self.content[-1] + else: + print('Stack is empty.') + + + +if __name__ == '__main__': + q = Stack() + + for i in range(10): + q.push(i) + for i in range(11): + print q.pop() \ No newline at end of file