From d9a9e5a499f5e62dcb951e042324a0080d01e7e6 Mon Sep 17 00:00:00 2001 From: vinothsid Date: Mon, 3 Feb 2020 20:50:30 -0800 Subject: [PATCH] Renamed directories without spaces --- ...m Analysis and Big O Quiz-checkpoint.ipynb | 32 - .../Big O Examples -checkpoint.ipynb | 580 ------------------ .../Big O Notation-checkpoint.ipynb | 206 ------- ...or Python Data Structures-checkpoint.ipynb | 288 --------- ...rithm Analysis and Big O -checkpoint.ipynb | 194 ------ .../Algorithm Analysis and Big O Quiz.ipynb | 32 - .../Big O Examples .ipynb | 558 ----------------- .../Big O Notation.ipynb | 206 ------- .../Big O for Python Data Structures.ipynb | 284 --------- ...ion to Algorithm Analysis and Big O .ipynb | 194 ------ .../Amortization-checkpoint.ipynb | 44 -- .../Array Mini-Project-checkpoint.ipynb | 45 -- .../Dynamic Array Exercise-checkpoint.ipynb | 329 ---------- .../Dynamic Arrays-checkpoint.ipynb | 44 -- ... to Array Based Sequences-checkpoint.ipynb | 112 ---- .../Low Level Arrays-checkpoint.ipynb | 43 -- Array Sequences/Amortization.ipynb | 44 -- Array Sequences/Array Mini-Project.ipynb | 45 -- .../Anagram Check -checkpoint.ipynb | 197 ------ .../Array Pair Sum -checkpoint.ipynb | 136 ---- ...Find the Missing Element -checkpoint.ipynb | 169 ----- .../Largest Continuous Sum -checkpoint.ipynb | 130 ---- .../Sentence Reversal-checkpoint.ipynb | 220 ------- .../String Compression -checkpoint.ipynb | 128 ---- ...ique Characters in String-checkpoint.ipynb | 126 ---- .../Anagram Check .ipynb | 213 ------- .../Array Pair Sum .ipynb | 136 ---- .../Find the Missing Element .ipynb | 181 ------ .../Largest Continuous Sum .ipynb | 128 ---- .../Sentence Reversal.ipynb | 220 ------- .../String Compression .ipynb | 143 ----- .../Unique Characters in String.ipynb | 126 ---- .../Anagram Check - SOLUTION-checkpoint.ipynb | 330 ---------- ...Array Pair Sum - SOLUTION-checkpoint.ipynb | 162 ----- ...issing Element - SOLUTION-checkpoint.ipynb | 272 -------- ...Continuous Sum - SOLUTION-checkpoint.ipynb | 146 ----- ...tence Reversal - SOLUTION-checkpoint.ipynb | 267 -------- ...ing Compression -SOLUTION-checkpoint.ipynb | 168 ----- ...ters in String - SOLUTION-checkpoint.ipynb | 124 ---- .../Anagram Check - SOLUTION.ipynb | 310 ---------- .../Array Pair Sum - SOLUTION.ipynb | 162 ----- .../Find the Missing Element - SOLUTION.ipynb | 272 -------- .../Largest Continuous Sum - SOLUTION.ipynb | 140 ----- .../Sentence Reversal - SOLUTION.ipynb | 257 -------- .../String Compression -SOLUTION.ipynb | 162 ----- ...ique Characters in String - SOLUTION.ipynb | 122 ---- .../Anagram Check -checkpoint.ipynb | 197 ------ .../Array Pair Sum -checkpoint.ipynb | 135 ---- ...Find the Missing Element -checkpoint.ipynb | 169 ----- .../Largest Continuous Sum -checkpoint.ipynb | 125 ---- .../Sentence Reversal-checkpoint.ipynb | 169 ----- .../String Compression -checkpoint.ipynb | 128 ---- ...ique Characters in String-checkpoint.ipynb | 104 ---- .../Anagram Check .ipynb | 197 ------ .../Array Pair Sum .ipynb | 135 ---- .../Find the Missing Element .ipynb | 169 ----- .../Largest Continuous Sum .ipynb | 125 ---- .../Sentence Reversal.ipynb | 169 ----- .../String Compression .ipynb | 128 ---- .../Unique Characters in String.ipynb | 104 ---- Array Sequences/Dynamic Array Exercise.ipynb | 309 ---------- Array Sequences/Dynamic Arrays.ipynb | 44 -- ...ntroduction to Array Based Sequences.ipynb | 112 ---- Array Sequences/Low Level Arrays.ipynb | 43 -- ...inked List Implementation-checkpoint.ipynb | 111 ---- .../Doubly Linked Lists-checkpoint.ipynb | 34 - .../Linked List Overview-checkpoint.ipynb | 42 -- ...inked List Implementation-checkpoint.ipynb | 120 ---- .../Singly Linked Lists-checkpoint.ipynb | 36 -- .../Doubly Linked List Implementation.ipynb | 111 ---- Linked Lists/Doubly Linked Lists.ipynb | 34 - Linked Lists/Linked List Overview.ipynb | 42 -- ...ment a Doubly Linked List-checkpoint.ipynb | 69 --- ...ment a Singly Linked List-checkpoint.ipynb | 69 --- ...ed List Nth to Last Node -checkpoint.ipynb | 192 ------ .../Linked List Reversal -checkpoint.ipynb | 244 -------- ...y Linked List Cycle Check-checkpoint.ipynb | 149 ----- .../Implement a Doubly Linked List.ipynb | 69 --- .../Implement a Singly Linked List.ipynb | 69 --- .../Linked List Nth to Last Node .ipynb | 192 ------ .../Linked List Reversal .ipynb | 246 -------- .../Singly Linked List Cycle Check.ipynb | 149 ----- ...t a Linked List -SOLUTION-checkpoint.ipynb | 158 ----- ...h to Last Node - SOLUTION-checkpoint.ipynb | 210 ------- ... List Reversal - SOLUTION-checkpoint.ipynb | 267 -------- ...st Cycle Check - SOLUTION-checkpoint.ipynb | 169 ----- .../Implement a Linked List -SOLUTION.ipynb | 158 ----- ...ked List Nth to Last Node - SOLUTION.ipynb | 210 ------- .../Linked List Reversal - SOLUTION.ipynb | 267 -------- ...y Linked List Cycle Check - SOLUTION.ipynb | 169 ----- ...ment a Doubly Linked List-checkpoint.ipynb | 67 -- ...ment a Singly Linked List-checkpoint.ipynb | 68 -- ...ed List Nth to Last Node -checkpoint.ipynb | 186 ------ .../Linked List Reversal -checkpoint.ipynb | 244 -------- ...y Linked List Cycle Check-checkpoint.ipynb | 147 ----- .../Implement a Doubly Linked List.ipynb | 67 -- .../Implement a Singly Linked List.ipynb | 68 -- .../Linked List Nth to Last Node .ipynb | 186 ------ .../Linked List Reversal .ipynb | 244 -------- .../Singly Linked List Cycle Check.ipynb | 147 ----- .../Singly Linked List Implementation.ipynb | 120 ---- Linked Lists/Singly Linked Lists.ipynb | 36 -- ...ite Question 1 - SOLUTION-checkpoint.ipynb | 232 ------- ...ite Question 2 - SOLUTION-checkpoint.ipynb | 164 ----- ...ite Question 3 - SOLUTION-checkpoint.ipynb | 196 ------ .../Phone Screen - SOLUTION-checkpoint.ipynb | 85 --- .../On-Site Question 1 - SOLUTION.ipynb | 226 ------- .../On-Site Question 2 - SOLUTION.ipynb | 160 ----- .../On-Site Question 3 - SOLUTION.ipynb | 196 ------ .../Phone Screen - SOLUTION.ipynb | 85 --- .../On-Site Question 1-checkpoint.ipynb | 56 -- .../On-Site Question 2 -checkpoint.ipynb | 51 -- .../On-Site Question 3-checkpoint.ipynb | 78 --- .../Phone Screen -checkpoint.ipynb | 49 -- .../On-Site Question 1.ipynb | 56 -- .../On-Site Question 2 .ipynb | 51 -- .../On-Site Question 3.ipynb | 78 --- .../Phone Screen .ipynb | 49 -- ...ite Question 1 - SOLUTION-checkpoint.ipynb | 127 ---- ...ite Question 2 - SOLUTION-checkpoint.ipynb | 149 ----- ...Site Question 3 -SOLUTION-checkpoint.ipynb | 91 --- ...ite Question 4 - SOLUTION-checkpoint.ipynb | 263 -------- .../Phone Screen-checkpoint.ipynb | 274 --------- .../On-Site Question 1 - SOLUTION.ipynb | 127 ---- .../On-Site Question 2 - SOLUTION.ipynb | 149 ----- .../On-Site Question 3 -SOLUTION.ipynb | 91 --- .../On-Site Question 4 - SOLUTION.ipynb | 263 -------- .../Phone Screen.ipynb | 274 --------- .../On-Site Question 1 -checkpoint.ipynb | 54 -- .../On-Site Question 2 -checkpoint.ipynb | 54 -- .../On-Site Question 3 -checkpoint.ipynb | 54 -- .../On-Site Question 4 -checkpoint.ipynb | 46 -- .../Phone Screen-checkpoint.ipynb | 80 --- .../On-Site Question 1 .ipynb | 54 -- .../On-Site Question 2 .ipynb | 54 -- .../On-Site Question 3 .ipynb | 54 -- .../On-Site Question 4 .ipynb | 46 -- .../Phone Screen.ipynb | 80 --- ...ite Question 1 - SOLUTION-checkpoint.ipynb | 149 ----- ...ite Question 2 - SOLUTION-checkpoint.ipynb | 115 ---- ...ite Question 3 - SOLUTION-checkpoint.ipynb | 121 ---- .../Phone Screen - SOLUTION-checkpoint.ipynb | 53 -- .../On-Site Question 1 - SOLUTION.ipynb | 149 ----- .../On-Site Question 2 - SOLUTION.ipynb | 115 ---- .../On-Site Question 3 - SOLUTION.ipynb | 121 ---- .../Phone Screen - SOLUTION.ipynb | 53 -- .../On-Site Question 1 -checkpoint.ipynb | 49 -- .../On-Site Question 2 -checkpoint.ipynb | 47 -- .../On-Site Question 3 -checkpoint.ipynb | 54 -- .../Phone Screen -checkpoint.ipynb | 47 -- .../On-Site Question 1 .ipynb | 49 -- .../On-Site Question 2 .ipynb | 47 -- .../On-Site Question 3 .ipynb | 54 -- .../Phone Screen .ipynb | 47 -- ...ite Question 1 - SOLUTION-checkpoint.ipynb | 138 ----- ...ite Question 2 - SOLUTION-checkpoint.ipynb | 86 --- ...ite Question 3 - SOLUTION-checkpoint.ipynb | 116 ---- .../Phone Screen - SOLUTION-checkpoint.ipynb | 87 --- .../On-Site Question 1 - SOLUTION.ipynb | 138 ----- .../On-Site Question 2 - SOLUTION.ipynb | 86 --- .../On-Site Question 3 - SOLUTION.ipynb | 116 ---- .../Phone Screen - SOLUTION.ipynb | 87 --- .../On-Site Question 1-checkpoint.ipynb | 49 -- .../On-Site Question 2-checkpoint.ipynb | 47 -- .../On-Site Question 3-checkpoint.ipynb | 47 -- .../Phone Screen -checkpoint.ipynb | 47 -- .../On-Site Question 1.ipynb | 49 -- .../On-Site Question 2.ipynb | 47 -- .../On-Site Question 3.ipynb | 47 -- .../Phone Screen .ipynb | 47 -- Reflect Notes.ipynb | 47 -- ...entation of Binary Search-checkpoint.ipynb | 226 ------- ...ementation of Bubble Sort-checkpoint.ipynb | 109 ---- ...ntation of Insertion Sort-checkpoint.ipynb | 105 ---- ...lementation of Merge Sort-checkpoint.ipynb | 119 ---- ...lementation of Quick Sort-checkpoint.ipynb | 132 ---- ...ntation of Selection Sort-checkpoint.ipynb | 104 ---- ...lementation of Shell Sort-checkpoint.ipynb | 114 ---- ...mentation of a Hash Table-checkpoint.ipynb | 277 --------- .../Sequential Search-checkpoint.ipynb | 235 ------- .../Implementation of Binary Search.ipynb | 226 ------- .../Implementation of Bubble Sort.ipynb | 105 ---- .../Implementation of Insertion Sort.ipynb | 103 ---- .../Implementation of Merge Sort.ipynb | 117 ---- .../Implementation of Quick Sort.ipynb | 130 ---- .../Implementation of Selection Sort.ipynb | 104 ---- .../Implementation of Shell Sort.ipynb | 114 ---- .../Implementation of a Hash Table.ipynb | 269 -------- Sorting and Searching/Sequential Search.ipynb | 235 ------- .../Deques Overview-checkpoint.ipynb | 69 --- .../Implementation of Deque-checkpoint.ipynb | 180 ------ .../Implementation of Queue-checkpoint.ipynb | 181 ------ .../Implementation of Stack-checkpoint.ipynb | 334 ---------- .../Queues Overview-checkpoint.ipynb | 115 ---- .../Stacks Overview-checkpoint.ipynb | 94 --- ...eues, and Deques Overview-checkpoint.ipynb | 53 -- .../Deques Overview.ipynb | 69 --- .../Implementation of Deque.ipynb | 180 ------ .../Implementation of Queue.ipynb | 181 ------ .../Implementation of Stack.ipynb | 334 ---------- .../Queues Overview.ipynb | 115 ---- .../Stacks Overview.ipynb | 94 --- ...lanced Parentheses Check -checkpoint.ipynb | 169 ----- .../Implement a Deque -checkpoint.ipynb | 51 -- ... Queue -Using Two Stacks -checkpoint.ipynb | 131 ---- .../Implement a Queue-checkpoint.ipynb | 104 ---- .../Implement a Stack -checkpoint.ipynb | 228 ------- .../Balanced Parentheses Check .ipynb | 169 ----- .../Implement a Deque .ipynb | 206 ------- ...Implement a Queue -Using Two Stacks .ipynb | 131 ---- .../Implement a Queue.ipynb | 104 ---- .../Implement a Stack .ipynb | 228 ------- ...entheses Check - SOLUTION-checkpoint.ipynb | 212 ------- ...lement a Deque - SOLUTION-checkpoint.ipynb | 65 -- ...lement a Queue - SOLUTION-checkpoint.ipynb | 59 -- ...ing Two Stacks - SOLUTION-checkpoint.ipynb | 134 ---- ...lement a Stack - SOLUTION-checkpoint.ipynb | 63 -- ...alanced Parentheses Check - SOLUTION.ipynb | 204 ------ .../Implement a Deque - SOLUTION.ipynb | 65 -- .../Implement a Queue - SOLUTION.ipynb | 59 -- ...a Queue -Using Two Stacks - SOLUTION.ipynb | 132 ---- .../Implement a Stack - SOLUTION.ipynb | 63 -- ...lanced Parentheses Check -checkpoint.ipynb | 171 ------ .../Implement a Deque -checkpoint.ipynb | 51 -- ... Queue -Using Two Stacks -checkpoint.ipynb | 131 ---- .../Implement a Queue-checkpoint.ipynb | 51 -- .../Implement a Stack -checkpoint.ipynb | 57 -- .../Balanced Parentheses Check .ipynb | 171 ------ .../Implement a Deque .ipynb | 51 -- ...Implement a Queue -Using Two Stacks .ipynb | 131 ---- .../Implement a Queue.ipynb | 51 -- .../Implement a Stack .ipynb | 57 -- .../Stacks, Queues, and Deques Overview.ipynb | 53 -- 233 files changed, 31277 deletions(-) delete mode 100644 Algorithm Analysis and Big O/.ipynb_checkpoints/Algorithm Analysis and Big O Quiz-checkpoint.ipynb delete mode 100644 Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Examples -checkpoint.ipynb delete mode 100644 Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Notation-checkpoint.ipynb delete mode 100644 Algorithm Analysis and Big O/.ipynb_checkpoints/Big O for Python Data Structures-checkpoint.ipynb delete mode 100644 Algorithm Analysis and Big O/.ipynb_checkpoints/Introduction to Algorithm Analysis and Big O -checkpoint.ipynb delete mode 100644 Algorithm Analysis and Big O/Algorithm Analysis and Big O Quiz.ipynb delete mode 100644 Algorithm Analysis and Big O/Big O Examples .ipynb delete mode 100644 Algorithm Analysis and Big O/Big O Notation.ipynb delete mode 100644 Algorithm Analysis and Big O/Big O for Python Data Structures.ipynb delete mode 100644 Algorithm Analysis and Big O/Introduction to Algorithm Analysis and Big O .ipynb delete mode 100644 Array Sequences/.ipynb_checkpoints/Amortization-checkpoint.ipynb delete mode 100644 Array Sequences/.ipynb_checkpoints/Array Mini-Project-checkpoint.ipynb delete mode 100644 Array Sequences/.ipynb_checkpoints/Dynamic Array Exercise-checkpoint.ipynb delete mode 100644 Array Sequences/.ipynb_checkpoints/Dynamic Arrays-checkpoint.ipynb delete mode 100644 Array Sequences/.ipynb_checkpoints/Introduction to Array Based Sequences-checkpoint.ipynb delete mode 100644 Array Sequences/.ipynb_checkpoints/Low Level Arrays-checkpoint.ipynb delete mode 100644 Array Sequences/Amortization.ipynb delete mode 100644 Array Sequences/Array Mini-Project.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/Anagram Check -checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/Array Pair Sum -checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/Find the Missing Element -checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/Largest Continuous Sum -checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/Sentence Reversal-checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/String Compression -checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/Unique Characters in String-checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Anagram Check .ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Array Pair Sum .ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Find the Missing Element .ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Largest Continuous Sum .ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Sentence Reversal.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/String Compression .ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Unique Characters in String.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Anagram Check - SOLUTION-checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Array Pair Sum - SOLUTION-checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Find the Missing Element - SOLUTION-checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Largest Continuous Sum - SOLUTION-checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Sentence Reversal - SOLUTION-checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/String Compression -SOLUTION-checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Unique Characters in String - SOLUTION-checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Anagram Check - SOLUTION.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Array Pair Sum - SOLUTION.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Find the Missing Element - SOLUTION.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Largest Continuous Sum - SOLUTION.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Sentence Reversal - SOLUTION.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/String Compression -SOLUTION.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Unique Characters in String - SOLUTION.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Anagram Check -checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Array Pair Sum -checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Find the Missing Element -checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Largest Continuous Sum -checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Sentence Reversal-checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/String Compression -checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Unique Characters in String-checkpoint.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Anagram Check .ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Array Pair Sum .ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Find the Missing Element .ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Largest Continuous Sum .ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Sentence Reversal.ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/String Compression .ipynb delete mode 100644 Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Unique Characters in String.ipynb delete mode 100644 Array Sequences/Dynamic Array Exercise.ipynb delete mode 100644 Array Sequences/Dynamic Arrays.ipynb delete mode 100644 Array Sequences/Introduction to Array Based Sequences.ipynb delete mode 100644 Array Sequences/Low Level Arrays.ipynb delete mode 100644 Linked Lists/.ipynb_checkpoints/Doubly Linked List Implementation-checkpoint.ipynb delete mode 100644 Linked Lists/.ipynb_checkpoints/Doubly Linked Lists-checkpoint.ipynb delete mode 100644 Linked Lists/.ipynb_checkpoints/Linked List Overview-checkpoint.ipynb delete mode 100644 Linked Lists/.ipynb_checkpoints/Singly Linked List Implementation-checkpoint.ipynb delete mode 100644 Linked Lists/.ipynb_checkpoints/Singly Linked Lists-checkpoint.ipynb delete mode 100644 Linked Lists/Doubly Linked List Implementation.ipynb delete mode 100644 Linked Lists/Doubly Linked Lists.ipynb delete mode 100644 Linked Lists/Linked List Overview.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/.ipynb_checkpoints/Implement a Doubly Linked List-checkpoint.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/.ipynb_checkpoints/Implement a Singly Linked List-checkpoint.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/.ipynb_checkpoints/Linked List Nth to Last Node -checkpoint.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/.ipynb_checkpoints/Linked List Reversal -checkpoint.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/.ipynb_checkpoints/Singly Linked List Cycle Check-checkpoint.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Implement a Doubly Linked List.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Implement a Singly Linked List.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Linked List Nth to Last Node .ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Linked List Reversal .ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Singly Linked List Cycle Check.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Implement a Linked List -SOLUTION-checkpoint.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Linked List Nth to Last Node - SOLUTION-checkpoint.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Linked List Reversal - SOLUTION-checkpoint.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Singly Linked List Cycle Check - SOLUTION-checkpoint.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Implement a Linked List -SOLUTION.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Linked List Nth to Last Node - SOLUTION.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Linked List Reversal - SOLUTION.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Singly Linked List Cycle Check - SOLUTION.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Implement a Doubly Linked List-checkpoint.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Implement a Singly Linked List-checkpoint.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Linked List Nth to Last Node -checkpoint.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Linked List Reversal -checkpoint.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Singly Linked List Cycle Check-checkpoint.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Implement a Doubly Linked List.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Implement a Singly Linked List.ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Linked List Nth to Last Node .ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Linked List Reversal .ipynb delete mode 100644 Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Singly Linked List Cycle Check.ipynb delete mode 100644 Linked Lists/Singly Linked List Implementation.ipynb delete mode 100644 Linked Lists/Singly Linked Lists.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/Phone Screen - SOLUTION.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/Phone Screen -checkpoint.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 1.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 2 .ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 3.ipynb delete mode 100644 Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/Phone Screen .ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 -SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 4 - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/Phone Screen-checkpoint.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 3 -SOLUTION.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 4 - SOLUTION.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/Phone Screen.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 4 -checkpoint.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/Phone Screen-checkpoint.ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 1 .ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 2 .ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 3 .ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 4 .ipynb delete mode 100644 Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/Phone Screen.ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/Phone Screen - SOLUTION.ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/Phone Screen -checkpoint.ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 1 .ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 2 .ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 3 .ipynb delete mode 100644 Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /Phone Screen .ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/Phone Screen - SOLUTION.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 2-checkpoint.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/Phone Screen -checkpoint.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 1.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 2.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 3.ipynb delete mode 100644 Mock Interviews/Social Network Company/Social Network Company - Interview Questions /Phone Screen .ipynb delete mode 100644 Reflect Notes.ipynb delete mode 100644 Sorting and Searching/.ipynb_checkpoints/Implementation of Binary Search-checkpoint.ipynb delete mode 100644 Sorting and Searching/.ipynb_checkpoints/Implementation of Bubble Sort-checkpoint.ipynb delete mode 100644 Sorting and Searching/.ipynb_checkpoints/Implementation of Insertion Sort-checkpoint.ipynb delete mode 100644 Sorting and Searching/.ipynb_checkpoints/Implementation of Merge Sort-checkpoint.ipynb delete mode 100644 Sorting and Searching/.ipynb_checkpoints/Implementation of Quick Sort-checkpoint.ipynb delete mode 100644 Sorting and Searching/.ipynb_checkpoints/Implementation of Selection Sort-checkpoint.ipynb delete mode 100644 Sorting and Searching/.ipynb_checkpoints/Implementation of Shell Sort-checkpoint.ipynb delete mode 100644 Sorting and Searching/.ipynb_checkpoints/Implementation of a Hash Table-checkpoint.ipynb delete mode 100644 Sorting and Searching/.ipynb_checkpoints/Sequential Search-checkpoint.ipynb delete mode 100644 Sorting and Searching/Implementation of Binary Search.ipynb delete mode 100644 Sorting and Searching/Implementation of Bubble Sort.ipynb delete mode 100644 Sorting and Searching/Implementation of Insertion Sort.ipynb delete mode 100644 Sorting and Searching/Implementation of Merge Sort.ipynb delete mode 100644 Sorting and Searching/Implementation of Quick Sort.ipynb delete mode 100644 Sorting and Searching/Implementation of Selection Sort.ipynb delete mode 100644 Sorting and Searching/Implementation of Shell Sort.ipynb delete mode 100644 Sorting and Searching/Implementation of a Hash Table.ipynb delete mode 100644 Sorting and Searching/Sequential Search.ipynb delete mode 100644 Stacks, Queues and Deques/.ipynb_checkpoints/Deques Overview-checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Deque-checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Queue-checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Stack-checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/.ipynb_checkpoints/Queues Overview-checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/.ipynb_checkpoints/Stacks Overview-checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/.ipynb_checkpoints/Stacks, Queues, and Deques Overview-checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Deques Overview.ipynb delete mode 100644 Stacks, Queues and Deques/Implementation of Deque.ipynb delete mode 100644 Stacks, Queues and Deques/Implementation of Queue.ipynb delete mode 100644 Stacks, Queues and Deques/Implementation of Stack.ipynb delete mode 100644 Stacks, Queues and Deques/Queues Overview.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks Overview.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Balanced Parentheses Check -checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Deque -checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Queue -Using Two Stacks -checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Queue-checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Stack -checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Balanced Parentheses Check .ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Deque .ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Queue -Using Two Stacks .ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Queue.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Stack .ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Balanced Parentheses Check - SOLUTION-checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Deque - SOLUTION-checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Queue - SOLUTION-checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Queue -Using Two Stacks - SOLUTION-checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Stack - SOLUTION-checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Balanced Parentheses Check - SOLUTION.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Deque - SOLUTION.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Queue - SOLUTION.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Queue -Using Two Stacks - SOLUTION.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Stack - SOLUTION.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Balanced Parentheses Check -checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Deque -checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Queue -Using Two Stacks -checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Queue-checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Stack -checkpoint.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Balanced Parentheses Check .ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Deque .ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Queue -Using Two Stacks .ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Queue.ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Stack .ipynb delete mode 100644 Stacks, Queues and Deques/Stacks, Queues, and Deques Overview.ipynb diff --git a/Algorithm Analysis and Big O/.ipynb_checkpoints/Algorithm Analysis and Big O Quiz-checkpoint.ipynb b/Algorithm Analysis and Big O/.ipynb_checkpoints/Algorithm Analysis and Big O Quiz-checkpoint.ipynb deleted file mode 100644 index 5f2b2c4f..00000000 --- a/Algorithm Analysis and Big O/.ipynb_checkpoints/Algorithm Analysis and Big O Quiz-checkpoint.ipynb +++ /dev/null @@ -1,32 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Quiz is offered only in the course!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Examples -checkpoint.ipynb b/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Examples -checkpoint.ipynb deleted file mode 100644 index 7f3a7a2d..00000000 --- a/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Examples -checkpoint.ipynb +++ /dev/null @@ -1,580 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Big O Examples\n", - "\n", - "In the first part of the Big-O example section we will go through various iterations of the various Big-O functions. Make sure to complete the reading assignment!\n", - "\n", - "Let's begin with some simple examples and explore what their Big-O is.\n", - "\n", - "## O(1) Constant" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n" - ] - } - ], - "source": [ - "def func_constant(values):\n", - " '''\n", - " Prints first item in a list of values.\n", - " '''\n", - " print values[0]\n", - " \n", - "func_constant([1,2,3])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how this function is constant because regardless of the list size, the function will only ever take a constant step size, in this case 1, printing the first value from a list. so we can see here that an input list of 100 values will print just 1 item, a list of 10,000 values will print just 1 item, and a list of **n** values will print just 1 item!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## O(n) Linear" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n", - "2\n", - "3\n" - ] - } - ], - "source": [ - "def func_lin(lst):\n", - " '''\n", - " Takes in list and prints out all values\n", - " '''\n", - " for val in lst:\n", - " print val\n", - " \n", - "func_lin([1,2,3])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This function runs in O(n) (linear time). This means that the number of operations taking place scales linearly with n, so we can see here that an input list of 100 values will print 100 times, a list of 10,000 values will print 10,000 times, and a list of **n** values will print **n** times." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## O(n^2) Quadratic" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 0\n", - "0 1\n", - "0 2\n", - "0 3\n", - "1 0\n", - "1 1\n", - "1 2\n", - "1 3\n", - "2 0\n", - "2 1\n", - "2 2\n", - "2 3\n", - "3 0\n", - "3 1\n", - "3 2\n", - "3 3\n" - ] - } - ], - "source": [ - "def func_quad(lst):\n", - " '''\n", - " Prints pairs for every item in list.\n", - " '''\n", - " for item_1 in lst:\n", - " for item_2 in lst:\n", - " print item_1,item_2\n", - " \n", - "lst = [0, 1, 2, 3]\n", - "\n", - "func_quad(lst)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how we now have two loops, one nested inside another. This means that for a list of n items, we will have to perform n operations for *every item in the list!* This means in total, we will perform n times n assignments, or n^2. So a list of 10 items will have 10^2, or 100 operations. You can see how dangerous this can get for very large inputs! This is why Big-O is so important to be aware of!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "______\n", - "## Calculating Scale of Big-O\n", - "\n", - "In this section we will discuss how insignificant terms drop out of Big-O notation.\n", - "\n", - "When it comes to Big O notation we only care about the most significant terms, remember as the input grows larger only the fastest growing terms will matter. If you've taken a calculus class before, this will reminf you of taking limits towards infinity. Let's see an example of how to drop constants:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def print_once(lst):\n", - " '''\n", - " Prints all items once\n", - " '''\n", - " for val in lst:\n", - " print val" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n" - ] - } - ], - "source": [ - "print_once(lst)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The print_once() function is O(n) since it will scale linearly with the input. What about the next example?" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def print_3(lst):\n", - " '''\n", - " Prints all items three times\n", - " '''\n", - " for val in lst:\n", - " print val\n", - " \n", - " for val in lst:\n", - " print val\n", - " \n", - " for val in lst:\n", - " print val" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n", - "0\n", - "1\n", - "2\n", - "3\n", - "0\n", - "1\n", - "2\n", - "3\n" - ] - } - ], - "source": [ - "print_3(lst)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the first function will print O(n) items and the second will print O(3n) items. However for n going to inifinity the constant can be dropped, since it will not have a large effect, so both functions are O(n).\n", - "\n", - "Let's see a more complex example of this:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def comp(lst):\n", - " '''\n", - " This function prints the first item O(1)\n", - " Then is prints the first 1/2 of the list O(n/2)\n", - " Then prints a string 10 times O(10)\n", - " '''\n", - " print lst[0]\n", - " \n", - " midpoint = len(lst)/2\n", - " \n", - " for val in lst[:midpoint]:\n", - " print val\n", - " \n", - " for x in range(10):\n", - " print 'number'" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n", - "1\n", - "2\n", - "3\n", - "4\n", - "5\n", - "number\n", - "number\n", - "number\n", - "number\n", - "number\n", - "number\n", - "number\n", - "number\n", - "number\n", - "number\n" - ] - } - ], - "source": [ - "lst = [1,2,3,4,5,6,7,8,9,10]\n", - "\n", - "comp(lst)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So let's break down the operations here. We can combine each operation to get the total Big-O of the function:\n", - "\n", - "$$O(1 + n/2 + 10)$$\n", - "\n", - "We can see that as n grows larger the 1 and 10 terms become insignificant and the 1/2 term multiplied against n will also not have much of an effect as n goes towards infinity. This means the function is simply O(n)!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Worst Case vs Best Case\n", - "\n", - "Many times we are only concerned with the worst possible case of an algorithm, but in an interview setting its important to keep in mind that worst case and best case scenarios may be completely different Big-O times. For example, consider the following function:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def matcher(lst,match):\n", - " '''\n", - " Given a list lst, return a boolean indicating if match item is in the list\n", - " '''\n", - " for item in lst:\n", - " if item == match:\n", - " return True\n", - " return False" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "lst" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "matcher(lst,1)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "matcher(lst,11)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that in the first scenario, the best case was actually O(1), since the match was found at the first element. In the case where there is no match, every element must be checked, this results in a worst case time of O(n). Later on we will also discuss average case time.\n", - "\n", - "Finally let's introduce the concept of space complexity.\n", - "\n", - "## Space Complexity\n", - "\n", - "Many times we are also concerned with how much memory/space an algorithm uses. The notation of space complexity is the same, but instead of checking the time of operations, we check the size of the allocation of memory.\n", - "\n", - "Let's see a few examples:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def printer(n=10):\n", - " '''\n", - " Prints \"hello world!\" n times\n", - " '''\n", - " for x in range(10):\n", - " print 'Hello World!'" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hello World!\n", - "Hello World!\n", - "Hello World!\n", - "Hello World!\n", - "Hello World!\n", - "Hello World!\n", - "Hello World!\n", - "Hello World!\n", - "Hello World!\n", - "Hello World!\n" - ] - } - ], - "source": [ - "printer()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how we only assign the 'hello world!' variable once, not every time we print. So the algorithm has O(1) **space** complexity and an O(n) **time** complexity. \n", - "\n", - "Let's see an example of O(n) **space** complexity:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def create_list(n):\n", - " new_list = []\n", - " \n", - " for num in range(n):\n", - " new_list.append('new')\n", - " \n", - " return new_list" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['new', 'new', 'new', 'new', 'new']\n" - ] - } - ], - "source": [ - "print create_list(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how the size of the new_list object scales with the input **n**, this shows that it is an O(n) algorithm with regards to **space** complexity.\n", - "_____\n", - "\n", - "Thats it for this lecture, before continuing on, make sure to complete the homework assignment below:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Homework Assignment\n", - "\n", - "Your homework assignment after this lecture is to read the fantastic explanations of Big-O at these two sources:\n", - "\n", - "* [Big-O Notation Explained](http://stackoverflow.com/questions/487258/plain-english-explanation-of-big-o/487278#487278)\n", - "\n", - "* [Big-O Examples Explained](http://stackoverflow.com/questions/2307283/what-does-olog-n-mean-exactly)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Notation-checkpoint.ipynb b/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Notation-checkpoint.ipynb deleted file mode 100644 index 28cb4211..00000000 --- a/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O Notation-checkpoint.ipynb +++ /dev/null @@ -1,206 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Big O Notation\n", - "In this lecture we will go over how the syntax of Big-O Notation works and how we can describe algorithms using Big-O Notation!\n", - "\n", - "We previously discussed the functions below:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# First function (Note the use of xrange since this is in Python 2)\n", - "def sum1(n):\n", - " '''\n", - " Take an input of n and return the sum of the numbers from 0 to n\n", - " '''\n", - " final_sum = 0\n", - " for x in xrange(n+1): \n", - " final_sum += x\n", - " \n", - " return final_sum" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def sum2(n):\n", - " \"\"\"\n", - " Take an input of n and return the sum of the numbers from 0 to n\n", - " \"\"\"\n", - " return (n*(n+1))/2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we want to develop a notation to objectively compare the efficiency of these two algorithms. A good place to start would be to compare the number of assignments each algorithm makes.\n", - "\n", - "The original **sum1** function will create an assignment **n+1** times, we can see this from the range based function. This means it will assign the final_sum variable n+1 times. We can then say that for a problem of n size (in this case just a number n) this function will take 1+n steps.\n", - "\n", - "This **n** notation allows us to compare solutions and algorithms relative to the size of the problem, since sum1(10) and sum1(100000) would take very different times to run but be using the same algorithm. We can also note that as n grows very large, the **+1** won't have much effect. So let's begin discussing how to build a syntax for this notation.\n", - "________\n", - "\n", - "Now we will discuss how we can formalize this notation and idea.\n", - "\n", - "Big-O notation describes *how quickly runtime will grow relative to the input as the input get arbitrarily large*.\n", - "\n", - "Let's examine some of these points more closely:\n", - "\n", - "* Remember, we want to compare how quickly runtime will grows, not compare exact runtimes, since those can vary depending on hardware.\n", - "\n", - "* Since we want to compare for a variety of input sizes, we are only concerned with runtime grow *relative* to the input. This is why we use **n** for notation.\n", - "\n", - "* As n gets arbitrarily large we only worry about terms that will grow the fastest as n gets large, to this point, Big-O analysis is also known as **asymptotic analysis**\n", - "\n", - "\n", - "As for syntax sum1() can be said to be **O(n)** since its runtime grows linearly with the input size. In the next lecture we will go over more specific examples of various O() types and examples. To conclude this lecture we will show the potential for vast difference in runtimes of Big-O functions.\n", - "\n", - "## Runtimes of Common Big-O Functions\n", - "\n", - "Here is a table of common Big-O functions:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - " \n", - " \n", - "\n", - " \n", - " \n", - "\n", - " \n", - " \n", - "\n", - " \n", - " \n", - "\n", - " \n", - " \n", - "\n", - "
Big-OName
1Constant
log(n)Logarithmic
nLinear
nlog(n)Log Linear
n^2Quadratic
n^3Cubic
2^nExponential
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's plot the runtime versus the Big-O to compare the runtimes. We'll use a simple [matplotlib](http://matplotlib.org/) for the plot below. (Don't be concerned with how to use matplotlib, that is irrelevant for this part)." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from math import log\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "plt.style.use('bmh')\n", - "\n", - "# Set up runtime comparisons\n", - "n = np.linspace(1,10,1000)\n", - "labels = ['Constant','Logarithmic','Linear','Log Linear','Quadratic','Cubic','Exponential']\n", - "big_o = [np.ones(n.shape),np.log(n),n,n*np.log(n),n**2,n**3,2**n]\n", - "\n", - "# Plot setup\n", - "plt.figure(figsize=(12,10))\n", - "plt.ylim(0,50)\n", - "\n", - "for i in range(len(big_o)):\n", - " plt.plot(n,big_o[i],label = labels[i])\n", - "\n", - "\n", - "plt.legend(loc=0)\n", - "plt.ylabel('Relative Runtime')\n", - "plt.xlabel('n')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how much of a difference a Big-O efficiency can make for the same n value against the projected runtime! Clearly we want to choose algorithms that stay away from any exponential, quadratic, or cubic behavior!\n", - "\n", - "In the next lecture we will learn how to properly denote Big-O and look at examples of various problems and calculate the Big-O of them!" - ] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python [conda env:python3]", - "language": "python", - "name": "conda-env-python3-py" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.1" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O for Python Data Structures-checkpoint.ipynb b/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O for Python Data Structures-checkpoint.ipynb deleted file mode 100644 index ee5c35e6..00000000 --- a/Algorithm Analysis and Big O/.ipynb_checkpoints/Big O for Python Data Structures-checkpoint.ipynb +++ /dev/null @@ -1,288 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Big O for Python Data Structures\n", - "In this lecture we will go over the Big O of built-in data structures in Python: Lists and Dictionaries." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lists\n", - "\n", - "In Python lists act as dynamic arrays and support a number of common operations through methods called on them. The two most common operations performed on a list are indexing and assigning to an index position. These operations are both designed to be run in constant time, O(1).\n", - "\n", - "Let's imagine you wanted to test different methods to construct a list that is [0,1,2...10000]. Let go ahead and compare various methods, such as appending to the end of a list, concatenating a list, or using tools such as casting and list comprehension.\n", - "\n", - "For example:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def method1():\n", - " l = []\n", - " for n in xrange(10000):\n", - " l = l + [n]\n", - "\n", - "def method2():\n", - " l = []\n", - " for n in xrange(10000):\n", - " l.append(n)\n", - "\n", - "def method3():\n", - " l = [n for n in xrange(10000)]\n", - "\n", - "def method4():\n", - " l = range(10000) # Python 3: list(range(10000))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's now test these methods using the timeit magic function:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "10 loops, best of 3: 162 ms per loop\n", - "1000 loops, best of 3: 820 µs per loop\n", - "1000 loops, best of 3: 307 µs per loop\n", - "10000 loops, best of 3: 77.7 µs per loop\n" - ] - } - ], - "source": [ - "%timeit method1()\n", - "%timeit method2()\n", - "%timeit method3()\n", - "%timeit method4()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can clearly see that the most effective method is the built-in range() function in Python!\n", - "\n", - "It is important to keep these factors in mind when writing efficient code. More importantly begin thinking about how we are able to index with O(1). We will discuss this in more detail when we cover arrays general. For now, take a look at the table below for an overview of Big-O efficiencies." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Table of Big-O for common list operations\n", - "\n", - "** Please note, in order to see this table, you may need to download this .ipynb file and view it locally, sometimes GitHub or nbveiwer have trouble showing the HTML for it... **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "
Operation Big-O Efficiency
index []O(1)
index assignmentO(1)
appendO(1)
pop()O(1)
pop(i)O(n)
insert(i,item)O(n)
del operatorO(n)
iterationO(n)
contains (in)O(n)
get slice [x:y]O(k)
del sliceO(n)
set sliceO(n+k)
reverseO(n)
concatenateO(k)
sortO(n log n)
multiplyO(nk)
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Dictionaries\n", - "\n", - "Dictionaries in Python are an implementation of a hash table. They operate with keys and values, for example:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "d = {'k1':1,'k2':2}" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "d['k1']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Something that is pretty amazing is that getting and setting items in a dictionary are O(1)! Hash tables are designed with efficiency in mind, and we will explore them in much more detail later on in the course as one of the most important data structures to undestand. In the meantime, refer to the table below for Big-O efficiencies of common dictionary operations:\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
OperationBig-O Efficiency
copyO(n)
get itemO(1)
set itemO(1)
delete itemO(1)
contains (in)O(1)
iterationO(n)
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Conclusion\n", - "\n", - "By the end of this section you should have an understanding of how Big-O is used in Algorithm analysis and be able to work out the Big-O of an algorithm you've developed. Get ready, there's a quiz up next!" - ] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python [conda env:python3]", - "language": "python", - "name": "conda-env-python3-py" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.1" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Algorithm Analysis and Big O/.ipynb_checkpoints/Introduction to Algorithm Analysis and Big O -checkpoint.ipynb b/Algorithm Analysis and Big O/.ipynb_checkpoints/Introduction to Algorithm Analysis and Big O -checkpoint.ipynb deleted file mode 100644 index 0238db22..00000000 --- a/Algorithm Analysis and Big O/.ipynb_checkpoints/Introduction to Algorithm Analysis and Big O -checkpoint.ipynb +++ /dev/null @@ -1,194 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true, - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Introduction to Algorithm Analysis and Big O\n", - "\n", - "In this lecture we will discuss how to analyze Algorithms and why it is important to do so!\n", - "\n", - "## Why analyze algorithms?\n", - "\n", - "Before we begin, let's clarify what an algorthim is. In this course, an **algorithm** is simply a procedure or formula for solving a problem. Some problems are famous enough that the algorithms have names, as well as some procdures being common enough that the algorithm associated with it also has a name. So now we have a good question we need to answer:\n", - "\n", - "** *How do analyze algorithms and how can we compare algorithms against each other?* **\n", - "\n", - "Imagine if you and a friend both came up with functions to sum the numbers from 0 to N. How would you compare the functions and algorithms within the functions? Let's say you both cam up with these two seperate functions:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# First function (Note the use of xrange since this is in Python 2)\n", - "def sum1(n):\n", - " '''\n", - " Take an input of n and return the sum of the numbers from 0 to n\n", - " '''\n", - " final_sum = 0\n", - " for x in xrange(n+1): \n", - " final_sum += x\n", - " \n", - " return final_sum" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "55" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sum1(10)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def sum2(n):\n", - " \"\"\"\n", - " Take an input of n and return the sum of the numbers from 0 to n\n", - " \"\"\"\n", - " return (n*(n+1))/2" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "55" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sum2(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You'll notice both functions have the same result, but completely different algorithms. You'll note that the first function iteratively adds the numbers, while the second function makes use of:\n", - "$$ \\sum_{i=0}^{n} {i} = \\frac{n(n+1)}{2} $$\n", - "\n", - "So how can we objectively compare the algorithms? We could compare the amount of space they take in memory or we could also compare how much time it takes each function to run. We can use the built in **%timeit** magic function in jupyter to compare the time of the functions. The [**%timeit**](https://ipython.org/ipython-doc/3/interactive/magics.html#magic-timeit) magic in Jupyter Notebooks will repeat the loop iteration a certain number of times and take the best result. Check out the link for the documentation. \n", - "\n", - "Let's go ahead and compare the time it took to run the functions:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The slowest run took 5.15 times longer than the fastest. This could mean that an intermediate result is being cached \n", - "100000 loops, best of 3: 4.86 µs per loop\n" - ] - } - ], - "source": [ - "%timeit sum1(100)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The slowest run took 16.54 times longer than the fastest. This could mean that an intermediate result is being cached \n", - "10000000 loops, best of 3: 173 ns per loop\n" - ] - } - ], - "source": [ - "%timeit sum2(100)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the second function is much more efficient! Running at a much faster rate than the first. However, we can not use \"time to run\" as an objective measurement, because that will depend on the speed of the computer itself and hardware capabilities. So we will need to use another method, **Big-O**!" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "In the next lecture we will discuss Big-O notation and why its so important!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Algorithm Analysis and Big O/Algorithm Analysis and Big O Quiz.ipynb b/Algorithm Analysis and Big O/Algorithm Analysis and Big O Quiz.ipynb deleted file mode 100644 index 5f2b2c4f..00000000 --- a/Algorithm Analysis and Big O/Algorithm Analysis and Big O Quiz.ipynb +++ /dev/null @@ -1,32 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Quiz is offered only in the course!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Algorithm Analysis and Big O/Big O Examples .ipynb b/Algorithm Analysis and Big O/Big O Examples .ipynb deleted file mode 100644 index 9352c727..00000000 --- a/Algorithm Analysis and Big O/Big O Examples .ipynb +++ /dev/null @@ -1,558 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Big O Examples\n", - "\n", - "In the first part of the Big-O example section we will go through various iterations of the various Big-O functions. Make sure to complete the reading assignment!\n", - "\n", - "Let's begin with some simple examples and explore what their Big-O is.\n", - "\n", - "## O(1) Constant" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n" - ] - } - ], - "source": [ - "def func_constant(values):\n", - " '''\n", - " Prints first item in a list of values.\n", - " '''\n", - " print values[0]\n", - " \n", - "func_constant([1,2,3])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how this function is constant because regardless of the list size, the function will only ever take a constant step size, in this case 1, printing the first value from a list. so we can see here that an input list of 100 values will print just 1 item, a list of 10,000 values will print just 1 item, and a list of **n** values will print just 1 item!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## O(n) Linear" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n", - "2\n", - "3\n" - ] - } - ], - "source": [ - "def func_lin(lst):\n", - " '''\n", - " Takes in list and prints out all values\n", - " '''\n", - " for val in lst:\n", - " print val\n", - " \n", - "func_lin([1,2,3])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This function runs in O(n) (linear time). This means that the number of operations taking place scales linearly with n, so we can see here that an input list of 100 values will print 100 times, a list of 10,000 values will print 10,000 times, and a list of **n** values will print **n** times." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## O(n^2) Quadratic" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 0\n", - "0 1\n", - "0 2\n", - "0 3\n", - "1 0\n", - "1 1\n", - "1 2\n", - "1 3\n", - "2 0\n", - "2 1\n", - "2 2\n", - "2 3\n", - "3 0\n", - "3 1\n", - "3 2\n", - "3 3\n" - ] - } - ], - "source": [ - "def func_quad(lst):\n", - " '''\n", - " Prints pairs for every item in list.\n", - " '''\n", - " for item_1 in lst:\n", - " for item_2 in lst:\n", - " print item_1,item_2\n", - " \n", - "lst = [0, 1, 2, 3]\n", - "\n", - "func_quad(lst)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how we now have two loops, one nested inside another. This means that for a list of n items, we will have to perform n operations for *every item in the list!* This means in total, we will perform n times n assignments, or n^2. So a list of 10 items will have 10^2, or 100 operations. You can see how dangerous this can get for very large inputs! This is why Big-O is so important to be aware of!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "______\n", - "## Calculating Scale of Big-O\n", - "\n", - "In this section we will discuss how insignificant terms drop out of Big-O notation.\n", - "\n", - "When it comes to Big O notation we only care about the most significant terms, remember as the input grows larger only the fastest growing terms will matter. If you've taken a calculus class before, this will reminf you of taking limits towards infinity. Let's see an example of how to drop constants:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def print_once(lst):\n", - " '''\n", - " Prints all items once\n", - " '''\n", - " for val in lst:\n", - " print val" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n" - ] - } - ], - "source": [ - "print_once(lst)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The print_once() function is O(n) since it will scale linearly with the input. What about the next example?" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def print_3(lst):\n", - " '''\n", - " Prints all items three times\n", - " '''\n", - " for val in lst:\n", - " print val\n", - " \n", - " for val in lst:\n", - " print val\n", - " \n", - " for val in lst:\n", - " print val" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n", - "0\n", - "1\n", - "2\n", - "3\n", - "0\n", - "1\n", - "2\n", - "3\n" - ] - } - ], - "source": [ - "print_3(lst)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the first function will print O(n) items and the second will print O(3n) items. However for n going to inifinity the constant can be dropped, since it will not have a large effect, so both functions are O(n).\n", - "\n", - "Let's see a more complex example of this:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def comp(lst):\n", - " '''\n", - " This function prints the first item O(1)\n", - " Then is prints the first 1/2 of the list O(n/2)\n", - " Then prints a string 10 times O(10)\n", - " '''\n", - " print lst[0]\n", - " \n", - " midpoint = len(lst)/2\n", - " \n", - " for val in lst[:midpoint]:\n", - " print val\n", - " \n", - " for x in range(10):\n", - " print 'number'" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n", - "1\n", - "2\n", - "3\n", - "4\n", - "5\n", - "number\n", - "number\n", - "number\n", - "number\n", - "number\n", - "number\n", - "number\n", - "number\n", - "number\n", - "number\n" - ] - } - ], - "source": [ - "lst = [1,2,3,4,5,6,7,8,9,10]\n", - "\n", - "comp(lst)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So let's break down the operations here. We can combine each operation to get the total Big-O of the function:\n", - "\n", - "$$O(1 + n/2 + 10)$$\n", - "\n", - "We can see that as n grows larger the 1 and 10 terms become insignificant and the 1/2 term multiplied against n will also not have much of an effect as n goes towards infinity. This means the function is simply O(n)!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Worst Case vs Best Case\n", - "\n", - "Many times we are only concerned with the worst possible case of an algorithm, but in an interview setting its important to keep in mind that worst case and best case scenarios may be completely different Big-O times. For example, consider the following function:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def matcher(lst,match):\n", - " '''\n", - " Given a list lst, return a boolean indicating if match item is in the list\n", - " '''\n", - " for item in lst:\n", - " if item == match:\n", - " return True\n", - " return False" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "lst" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "matcher(lst,1)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "matcher(lst,11)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that in the first scenario, the best case was actually O(1), since the match was found at the first element. In the case where there is no match, every element must be checked, this results in a worst case time of O(n). Later on we will also discuss average case time.\n", - "\n", - "Finally let's introduce the concept of space complexity.\n", - "\n", - "## Space Complexity\n", - "\n", - "Many times we are also concerned with how much memory/space an algorithm uses. The notation of space complexity is the same, but instead of checking the time of operations, we check the size of the allocation of memory.\n", - "\n", - "Let's see a few examples:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def printer(n=10):\n", - " '''\n", - " Prints \"hello world!\" n times\n", - " '''\n", - " for x in range(n):\n", - " print 'Hello World!'" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hello World!\n", - "Hello World!\n", - "Hello World!\n", - "Hello World!\n", - "Hello World!\n", - "Hello World!\n", - "Hello World!\n", - "Hello World!\n", - "Hello World!\n", - "Hello World!\n" - ] - } - ], - "source": [ - "printer()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how we only assign the 'hello world!' variable once, not every time we print. So the algorithm has O(1) **space** complexity and an O(n) **time** complexity. \n", - "\n", - "Let's see an example of O(n) **space** complexity:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def create_list(n):\n", - " new_list = []\n", - " \n", - " for num in range(n):\n", - " new_list.append('new')\n", - " \n", - " return new_list" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['new', 'new', 'new', 'new', 'new']\n" - ] - } - ], - "source": [ - "print create_list(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how the size of the new_list object scales with the input **n**, this shows that it is an O(n) algorithm with regards to **space** complexity.\n", - "_____\n", - "\n", - "Thats it for this lecture, before continuing on, make sure to complete the homework assignment below:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Homework Assignment\n", - "\n", - "Your homework assignment after this lecture is to read the fantastic explanations of Big-O at these two sources:\n", - "\n", - "* [Big-O Notation Explained](http://stackoverflow.com/questions/487258/plain-english-explanation-of-big-o/487278#487278)\n", - "\n", - "* [Big-O Examples Explained](http://stackoverflow.com/questions/2307283/what-does-olog-n-mean-exactly)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Algorithm Analysis and Big O/Big O Notation.ipynb b/Algorithm Analysis and Big O/Big O Notation.ipynb deleted file mode 100644 index 28cb4211..00000000 --- a/Algorithm Analysis and Big O/Big O Notation.ipynb +++ /dev/null @@ -1,206 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Big O Notation\n", - "In this lecture we will go over how the syntax of Big-O Notation works and how we can describe algorithms using Big-O Notation!\n", - "\n", - "We previously discussed the functions below:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# First function (Note the use of xrange since this is in Python 2)\n", - "def sum1(n):\n", - " '''\n", - " Take an input of n and return the sum of the numbers from 0 to n\n", - " '''\n", - " final_sum = 0\n", - " for x in xrange(n+1): \n", - " final_sum += x\n", - " \n", - " return final_sum" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def sum2(n):\n", - " \"\"\"\n", - " Take an input of n and return the sum of the numbers from 0 to n\n", - " \"\"\"\n", - " return (n*(n+1))/2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we want to develop a notation to objectively compare the efficiency of these two algorithms. A good place to start would be to compare the number of assignments each algorithm makes.\n", - "\n", - "The original **sum1** function will create an assignment **n+1** times, we can see this from the range based function. This means it will assign the final_sum variable n+1 times. We can then say that for a problem of n size (in this case just a number n) this function will take 1+n steps.\n", - "\n", - "This **n** notation allows us to compare solutions and algorithms relative to the size of the problem, since sum1(10) and sum1(100000) would take very different times to run but be using the same algorithm. We can also note that as n grows very large, the **+1** won't have much effect. So let's begin discussing how to build a syntax for this notation.\n", - "________\n", - "\n", - "Now we will discuss how we can formalize this notation and idea.\n", - "\n", - "Big-O notation describes *how quickly runtime will grow relative to the input as the input get arbitrarily large*.\n", - "\n", - "Let's examine some of these points more closely:\n", - "\n", - "* Remember, we want to compare how quickly runtime will grows, not compare exact runtimes, since those can vary depending on hardware.\n", - "\n", - "* Since we want to compare for a variety of input sizes, we are only concerned with runtime grow *relative* to the input. This is why we use **n** for notation.\n", - "\n", - "* As n gets arbitrarily large we only worry about terms that will grow the fastest as n gets large, to this point, Big-O analysis is also known as **asymptotic analysis**\n", - "\n", - "\n", - "As for syntax sum1() can be said to be **O(n)** since its runtime grows linearly with the input size. In the next lecture we will go over more specific examples of various O() types and examples. To conclude this lecture we will show the potential for vast difference in runtimes of Big-O functions.\n", - "\n", - "## Runtimes of Common Big-O Functions\n", - "\n", - "Here is a table of common Big-O functions:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - " \n", - " \n", - "\n", - " \n", - " \n", - "\n", - " \n", - " \n", - "\n", - " \n", - " \n", - "\n", - " \n", - " \n", - "\n", - "
Big-OName
1Constant
log(n)Logarithmic
nLinear
nlog(n)Log Linear
n^2Quadratic
n^3Cubic
2^nExponential
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's plot the runtime versus the Big-O to compare the runtimes. We'll use a simple [matplotlib](http://matplotlib.org/) for the plot below. (Don't be concerned with how to use matplotlib, that is irrelevant for this part)." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from math import log\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "plt.style.use('bmh')\n", - "\n", - "# Set up runtime comparisons\n", - "n = np.linspace(1,10,1000)\n", - "labels = ['Constant','Logarithmic','Linear','Log Linear','Quadratic','Cubic','Exponential']\n", - "big_o = [np.ones(n.shape),np.log(n),n,n*np.log(n),n**2,n**3,2**n]\n", - "\n", - "# Plot setup\n", - "plt.figure(figsize=(12,10))\n", - "plt.ylim(0,50)\n", - "\n", - "for i in range(len(big_o)):\n", - " plt.plot(n,big_o[i],label = labels[i])\n", - "\n", - "\n", - "plt.legend(loc=0)\n", - "plt.ylabel('Relative Runtime')\n", - "plt.xlabel('n')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how much of a difference a Big-O efficiency can make for the same n value against the projected runtime! Clearly we want to choose algorithms that stay away from any exponential, quadratic, or cubic behavior!\n", - "\n", - "In the next lecture we will learn how to properly denote Big-O and look at examples of various problems and calculate the Big-O of them!" - ] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python [conda env:python3]", - "language": "python", - "name": "conda-env-python3-py" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.1" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Algorithm Analysis and Big O/Big O for Python Data Structures.ipynb b/Algorithm Analysis and Big O/Big O for Python Data Structures.ipynb deleted file mode 100644 index dd014176..00000000 --- a/Algorithm Analysis and Big O/Big O for Python Data Structures.ipynb +++ /dev/null @@ -1,284 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Big O for Python Data Structures\n", - "In this lecture we will go over the Big O of built-in data structures in Python: Lists and Dictionaries." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lists\n", - "\n", - "In Python lists act as dynamic arrays and support a number of common operations through methods called on them. The two most common operations performed on a list are indexing and assigning to an index position. These operations are both designed to be run in constant time, O(1).\n", - "\n", - "Let's imagine you wanted to test different methods to construct a list that is [0,1,2...10000]. Let go ahead and compare various methods, such as appending to the end of a list, concatenating a list, or using tools such as casting and list comprehension.\n", - "\n", - "For example:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def method1():\n", - " l = []\n", - " for n in xrange(10000):\n", - " l = l + [n]\n", - "\n", - "def method2():\n", - " l = []\n", - " for n in xrange(10000):\n", - " l.append(n)\n", - "\n", - "def method3():\n", - " l = [n for n in xrange(10000)]\n", - "\n", - "def method4():\n", - " l = range(10000) # Python 3: list(range(10000))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's now test these methods using the timeit magic function:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "10 loops, best of 3: 162 ms per loop\n", - "1000 loops, best of 3: 820 µs per loop\n", - "1000 loops, best of 3: 307 µs per loop\n", - "10000 loops, best of 3: 77.7 µs per loop\n" - ] - } - ], - "source": [ - "%timeit method1()\n", - "%timeit method2()\n", - "%timeit method3()\n", - "%timeit method4()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can clearly see that the most effective method is the built-in range() function in Python!\n", - "\n", - "It is important to keep these factors in mind when writing efficient code. More importantly begin thinking about how we are able to index with O(1). We will discuss this in more detail when we cover arrays general. For now, take a look at the table below for an overview of Big-O efficiencies." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Table of Big-O for common list operations\n", - "\n", - "** Please note, in order to see this table, you may need to download this .ipynb file and view it locally, sometimes GitHub or nbveiwer have trouble showing the HTML for it... **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "
Operation Big-O Efficiency
index []O(1)
index assignmentO(1)
appendO(1)
pop()O(1)
pop(i)O(n)
insert(i,item)O(n)
del operatorO(n)
iterationO(n)
contains (in)O(n)
get slice [x:y]O(k)
del sliceO(n)
set sliceO(n+k)
reverseO(n)
concatenateO(k)
sortO(n log n)
multiplyO(nk)
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Dictionaries\n", - "\n", - "Dictionaries in Python are an implementation of a hash table. They operate with keys and values, for example:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "d = {'k1':1,'k2':2}" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "d['k1']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Something that is pretty amazing is that getting and setting items in a dictionary are O(1)! Hash tables are designed with efficiency in mind, and we will explore them in much more detail later on in the course as one of the most important data structures to undestand. In the meantime, refer to the table below for Big-O efficiencies of common dictionary operations:\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
OperationBig-O Efficiency
copyO(n)
get itemO(1)
set itemO(1)
delete itemO(1)
contains (in)O(1)
iterationO(n)
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Conclusion\n", - "\n", - "By the end of this section you should have an understanding of how Big-O is used in Algorithm analysis and be able to work out the Big-O of an algorithm you've developed. Get ready, there's a quiz up next!" - ] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Algorithm Analysis and Big O/Introduction to Algorithm Analysis and Big O .ipynb b/Algorithm Analysis and Big O/Introduction to Algorithm Analysis and Big O .ipynb deleted file mode 100644 index 0238db22..00000000 --- a/Algorithm Analysis and Big O/Introduction to Algorithm Analysis and Big O .ipynb +++ /dev/null @@ -1,194 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true, - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Introduction to Algorithm Analysis and Big O\n", - "\n", - "In this lecture we will discuss how to analyze Algorithms and why it is important to do so!\n", - "\n", - "## Why analyze algorithms?\n", - "\n", - "Before we begin, let's clarify what an algorthim is. In this course, an **algorithm** is simply a procedure or formula for solving a problem. Some problems are famous enough that the algorithms have names, as well as some procdures being common enough that the algorithm associated with it also has a name. So now we have a good question we need to answer:\n", - "\n", - "** *How do analyze algorithms and how can we compare algorithms against each other?* **\n", - "\n", - "Imagine if you and a friend both came up with functions to sum the numbers from 0 to N. How would you compare the functions and algorithms within the functions? Let's say you both cam up with these two seperate functions:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# First function (Note the use of xrange since this is in Python 2)\n", - "def sum1(n):\n", - " '''\n", - " Take an input of n and return the sum of the numbers from 0 to n\n", - " '''\n", - " final_sum = 0\n", - " for x in xrange(n+1): \n", - " final_sum += x\n", - " \n", - " return final_sum" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "55" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sum1(10)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def sum2(n):\n", - " \"\"\"\n", - " Take an input of n and return the sum of the numbers from 0 to n\n", - " \"\"\"\n", - " return (n*(n+1))/2" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "55" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sum2(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You'll notice both functions have the same result, but completely different algorithms. You'll note that the first function iteratively adds the numbers, while the second function makes use of:\n", - "$$ \\sum_{i=0}^{n} {i} = \\frac{n(n+1)}{2} $$\n", - "\n", - "So how can we objectively compare the algorithms? We could compare the amount of space they take in memory or we could also compare how much time it takes each function to run. We can use the built in **%timeit** magic function in jupyter to compare the time of the functions. The [**%timeit**](https://ipython.org/ipython-doc/3/interactive/magics.html#magic-timeit) magic in Jupyter Notebooks will repeat the loop iteration a certain number of times and take the best result. Check out the link for the documentation. \n", - "\n", - "Let's go ahead and compare the time it took to run the functions:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The slowest run took 5.15 times longer than the fastest. This could mean that an intermediate result is being cached \n", - "100000 loops, best of 3: 4.86 µs per loop\n" - ] - } - ], - "source": [ - "%timeit sum1(100)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The slowest run took 16.54 times longer than the fastest. This could mean that an intermediate result is being cached \n", - "10000000 loops, best of 3: 173 ns per loop\n" - ] - } - ], - "source": [ - "%timeit sum2(100)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the second function is much more efficient! Running at a much faster rate than the first. However, we can not use \"time to run\" as an objective measurement, because that will depend on the speed of the computer itself and hardware capabilities. So we will need to use another method, **Big-O**!" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "In the next lecture we will discuss Big-O notation and why its so important!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/.ipynb_checkpoints/Amortization-checkpoint.ipynb b/Array Sequences/.ipynb_checkpoints/Amortization-checkpoint.ipynb deleted file mode 100644 index d58ff51c..00000000 --- a/Array Sequences/.ipynb_checkpoints/Amortization-checkpoint.ipynb +++ /dev/null @@ -1,44 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Amortization" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "___\n", - "## Please refer to the video lecture for the remaining information.\n", - "## The section consists mostly of video explanations not well-suited for Jupyter Notebooks.\n", - "# Thanks!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/.ipynb_checkpoints/Array Mini-Project-checkpoint.ipynb b/Array Sequences/.ipynb_checkpoints/Array Mini-Project-checkpoint.ipynb deleted file mode 100644 index 1a4dc652..00000000 --- a/Array Sequences/.ipynb_checkpoints/Array Mini-Project-checkpoint.ipynb +++ /dev/null @@ -1,45 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# Array Mini-Project\n", - "\n", - "In this mini project we will create our own scoreboard project to understand arrays better!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/.ipynb_checkpoints/Dynamic Array Exercise-checkpoint.ipynb b/Array Sequences/.ipynb_checkpoints/Dynamic Array Exercise-checkpoint.ipynb deleted file mode 100644 index 732a6e15..00000000 --- a/Array Sequences/.ipynb_checkpoints/Dynamic Array Exercise-checkpoint.ipynb +++ /dev/null @@ -1,329 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Dynamic Array Exercise\n", - "____\n", - "\n", - "In this exercise we will create our own Dynamic Array class!\n", - "\n", - "We'll be using a built in library called [ctypes](https://docs.python.org/2/library/ctypes.html). Check out the documentation for more info, but its basically going to be used here as a raw array from the ctypes module.\n", - "If you find yourself very interested in it, check out: [Ctypes Tutorial](http://starship.python.net/crew/theller/ctypes/tutorial.html)\n", - "\n", - "Also..." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**A quick note on public vs private methods, we can use an underscore _ before the method name to keep it non-public. For example:**" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class M(object):\n", - " \n", - " def public(self):\n", - " print 'Use Tab to see me!'\n", - " \n", - " def _private(self):\n", - " print \"You won't be able to Tab to see me!\"" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "m = M()" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Use Tab to see me!\n" - ] - } - ], - "source": [ - "m.public()" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You won't be able to see me!\n" - ] - } - ], - "source": [ - "m._private()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Check out PEP 8 and the Python docs for more info on this!\n", - "_____\n", - "\n", - "### Dynamic Array Implementation" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import ctypes\n", - "\n", - "class DynamicArray(object):\n", - " '''\n", - " DYNAMIC ARRAY CLASS (Similar to Python List)\n", - " '''\n", - " \n", - " def __init__(self):\n", - " self.n = 0 # Count actual elements (Default is 0)\n", - " self.capacity = 1 # Default Capacity\n", - " self.A = self.make_array(self.capacity)\n", - " \n", - " def __len__(self):\n", - " \"\"\"\n", - " Return number of elements sorted in array\n", - " \"\"\"\n", - " return self.n\n", - " \n", - " def __getitem__(self,k):\n", - " \"\"\"\n", - " Return element at index k\n", - " \"\"\"\n", - " if not 0 <= k \u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mlarge_cont_sum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mlarge_cont_sum\u001b[0;34m(arr)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0marr\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0msum\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mmax\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: 'int' object is not callable" - ] - } - ], - "source": [ - "large_cont_sum([1,2,-1,3,4,10,10,-10,-1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "Many times in an interview setting the question also requires you to report back the start and end points of the sum. Keep this in mind and see if you can solve that problem, we'll see it in the mock interview section of the course!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "from nose.tools import assert_equal\n", - "\n", - "class LargeContTest(object):\n", - " def test(self,sol):\n", - " assert_equal(sol([1,2,-1,3,4,-1]),9)\n", - " assert_equal(sol([1,2,-1,3,4,10,10,-10,-1]),29)\n", - " assert_equal(sol([-1,1]),1)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "#Run Test\n", - "t = LargeContTest()\n", - "t.test(large_cont_sum)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/Sentence Reversal-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/Sentence Reversal-checkpoint.ipynb deleted file mode 100644 index f1ce5f7a..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/Sentence Reversal-checkpoint.ipynb +++ /dev/null @@ -1,220 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Sentence Reversal\n", - "\n", - "## Problem\n", - "\n", - "Given a string of words, reverse all the words. For example:\n", - "\n", - "Given:\n", - " \n", - " 'This is the best'\n", - "\n", - "Return:\n", - "\n", - " 'best the is This'\n", - "\n", - "As part of this exercise you should remove all leading and trailing whitespace. So that inputs such as:\n", - "\n", - " ' space here' and 'space here '\n", - "\n", - "both become:\n", - "\n", - " 'here space'\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "def rev_word(s):\n", - " return \" \".join(reversed(s.split()))\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'go? to ready you are John, Hi'" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word('Hi John, are you ready to go?')" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'before space'" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word(' space before')" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'after space'" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word('space after ')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Learn\n", - "- \" \".join()\n", - "- reversed()\n", - "- s.split()" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'\\nInit signature: reversed(self, /, *args, **kwargs)\\nDocstring: \\nreversed(sequence) -> reverse iterator over values of the sequence\\n\\nReturn a reverse iterator\\nType: type\\n'" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# reversed()\n", - "'''\n", - "Init signature: reversed(self, /, *args, **kwargs)\n", - "Docstring: \n", - "reversed(sequence) -> reverse iterator over values of the sequence\n", - "\n", - "Return a reverse iterator\n", - "Type: type\n", - "'''" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "_____" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class ReversalTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(' space before'),'before space')\n", - " assert_equal(sol('space after '),'after space')\n", - " assert_equal(sol(' Hello John how are you '),'you are how John Hello')\n", - " assert_equal(sol('1'),'1')\n", - " print (\"ALL TEST CASES PASSED\")\n", - " \n", - "# Run and test\n", - "t = ReversalTest()\n", - "t.test(rev_word)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/String Compression -checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/String Compression -checkpoint.ipynb deleted file mode 100644 index e8c7d5f4..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/String Compression -checkpoint.ipynb +++ /dev/null @@ -1,128 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# String Compression\n", - "\n", - "## Problem\n", - "\n", - "Given a string in the form 'AAAABBBBCCCCCDDEEEE' compress it to become 'A4B4C5D2E4'. For this problem, you can falsely \"compress\" strings of single or double letters. For instance, it is okay for 'AAB' to return 'A2B1' even though this technically takes more space. \n", - "\n", - "The function should also be case sensitive, so that a string 'AAAaaa' returns 'A3a3'." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def compress(s):\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'A5B4C4'" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compress('AAAAABBBBCCCC')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestCompress(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), '')\n", - " assert_equal(sol('AABBCC'), 'A2B2C2')\n", - " assert_equal(sol('AAABCCDDDDD'), 'A3B1C2D5')\n", - " print 'ALL TEST CASES PASSED'\n", - "\n", - "# Run Tests\n", - "t = TestCompress()\n", - "t.test(compress)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/Unique Characters in String-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/Unique Characters in String-checkpoint.ipynb deleted file mode 100644 index e844d767..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/.ipynb_checkpoints/Unique Characters in String-checkpoint.ipynb +++ /dev/null @@ -1,126 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Unique Characters in String\n", - "\n", - "## Problem\n", - "Given a string,determine if it is compreised of all unique characters. For example, the string 'abcde' has all unique characters and should return True. The string 'aabcde' contains duplicate characters and should return false." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def uni_char(s):\n", - " u = set()\n", - " for c in s:\n", - " if c in u:\n", - " return False\n", - " else:\n", - " u.add(c)\n", - " return True\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Learn This One Line Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "# another 1-line solution\n", - "def uni_char2(s):\n", - " return len(set(s)) == len(s)\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR CODE>\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "\n", - "class TestUnique(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), True)\n", - " assert_equal(sol('goo'), False)\n", - " assert_equal(sol('abcdefg'), True)\n", - " print ('ALL TEST CASES PASSED')\n", - " \n", - "# Run Tests\n", - "t = TestUnique()\n", - "t.test(uni_char)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Anagram Check .ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Anagram Check .ipynb deleted file mode 100644 index eac9c379..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Anagram Check .ipynb +++ /dev/null @@ -1,213 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Anagram Check\n", - "\n", - "## Problem\n", - "\n", - "Given two strings, check to see if they are anagrams. An anagram is when the two strings can be written using the exact same letters (so you can just rearrange the letters to get a different phrase or word). \n", - "\n", - "For example:\n", - "\n", - " \"public relations\" is an anagram of \"crap built on lies.\"\n", - " \n", - " \"clint eastwood\" is an anagram of \"old west action\"\n", - " \n", - "**Note: Ignore spaces and capitalization. So \"d go\" is an anagram of \"God\" and \"dog\" and \"o d g\".**\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# 242. Valid Anagram(https://leetcode.com/problems/valid-anagram/description/)\n", - "def anagram(s, t):\n", - " \"\"\"\n", - " :type s: str\n", - " :type t: str\n", - " :rtype: bool\n", - " \"\"\"\n", - " s=s.replace(' ','').lower()\n", - " t=t.replace(' ','').lower()\n", - " \n", - " if(len(s)!=len(t)):\n", - " return False\n", - " counter = {}\n", - " for letter in s:\n", - " if letter in counter:\n", - " counter[letter] += 1\n", - " else:\n", - " counter[letter] = 1\n", - "\n", - " for letter in t:\n", - " if letter in counter:\n", - " counter[letter] -= 1\n", - " else:\n", - " return False\n", - "\n", - " for k in counter:\n", - " if counter[k]!=0:\n", - " return False\n", - " \n", - " return True\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('dog','god')" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('clint eastwood','old west action')" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('aa','bb')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "Run the cell below to test your solution" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class AnagramTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol('go go go','gggooo'),True)\n", - " assert_equal(sol('abc','cba'),True)\n", - " assert_equal(sol('hi man','hi man'),True)\n", - " assert_equal(sol('aabbcc','aabbc'),False)\n", - " assert_equal(sol('123','1 2'),False)\n", - " print('ALL TEST CASES PASSED')\n", - "\n", - "# Run Tests\n", - "t = AnagramTest()\n", - "t.test(anagram)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "t.test(anagram2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Array Pair Sum .ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Array Pair Sum .ipynb deleted file mode 100644 index 36525741..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Array Pair Sum .ipynb +++ /dev/null @@ -1,136 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Array Pair Sum\n", - "\n", - "## Problem\n", - "\n", - "Given an integer array, output all the ** *unique* ** pairs that sum up to a specific value **k**.\n", - "\n", - "So the input:\n", - " \n", - " pair_sum([1,3,2,2],4)\n", - "\n", - "would return **2** pairs:\n", - "\n", - " (1,3)\n", - " (2,2)\n", - "\n", - "**NOTE: FOR TESTING PURPOSES CHANGE YOUR FUNCTION SO IT OUTPUTS THE NUMBER OF PAIRS**\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def pair_sum(arr,k):\n", - " counter = 0\n", - " lookup = set()\n", - " for num in arr:\n", - " if k-num in lookup:\n", - " counter+=1\n", - " else:\n", - " lookup.add(num)\n", - " return counter\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pair_sum([1,3,2,2],4)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestPair(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol([1,9,2,8,3,7,4,6,5,5,13,14,11,13,-1],10),6)\n", - " assert_equal(sol([1,2,3,1],3),1)\n", - " assert_equal(sol([1,3,2,2],4),2)\n", - " print('ALL TEST CASES PASSED')\n", - " \n", - "#Run tests\n", - "t = TestPair()\n", - "t.test(pair_sum)\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Find the Missing Element .ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Find the Missing Element .ipynb deleted file mode 100644 index 78327449..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Find the Missing Element .ipynb +++ /dev/null @@ -1,181 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Find the Missing Element\n", - "\n", - "## Problem\n", - "\n", - "Consider an array of non-negative integers. A second array is formed by shuffling the elements of the first array and deleting a random element. Given these two arrays, find which element is missing in the second array. \n", - "\n", - "Here is an example input, the first array is shuffled and the number 5 is removed to construct the second array.\n", - "\n", - "Input:\n", - " \n", - " finder([1,2,3,4,5,6,7],[3,7,2,1,4,6])\n", - "\n", - "Output:\n", - "\n", - " 5 is the missing number\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def finder(arr1,arr2):\n", - " num = 0\n", - " for n in arr1:\n", - " num += n\n", - " for n in arr2:\n", - " num -= n\n", - " return num\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "28\n" - ] - }, - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = [1,2,3,4,5,6,7]\n", - "arr2 = [3,7,2,1,4,6]\n", - "finder(arr1,arr2)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "24\n" - ] - }, - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = [5,5,7,7]\n", - "arr2 = [5,7,7]\n", - "\n", - "finder(arr1,arr2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "_____" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "24\n", - "28\n", - "45\n", - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestFinder(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol([5,5,7,7],[5,7,7]),5)\n", - " assert_equal(sol([1,2,3,4,5,6,7],[3,7,2,1,4,6]),5)\n", - " assert_equal(sol([9,8,7,6,5,4,3,2,1],[9,8,7,5,4,3,2,1]),6)\n", - " print('ALL TEST CASES PASSED')\n", - "\n", - "# Run test\n", - "t = TestFinder()\n", - "t.test(finder)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Largest Continuous Sum .ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Largest Continuous Sum .ipynb deleted file mode 100644 index be1f654d..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Largest Continuous Sum .ipynb +++ /dev/null @@ -1,128 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Largest Continuous Sum\n", - "\n", - "## Problem\n", - "Given an array of integers (positive and negative) find the largest continuous sum. \n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "def large_cont_sum(arr):\n", - " if len(arr) == 0:\n", - " return 0\n", - " \n", - " max_num = sum = arr[0]# max=sum=arr[0] bug: TypeError: 'int' object is not callable. (Do not use the keyword!)\n", - " \n", - " for n in arr[1:]:\n", - " sum = max(sum+n, n)\n", - " max_num = max(sum, max_num)\n", - " return max_num\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "29" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "large_cont_sum([1,2,-1,3,4,10,10,-10,-1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "Many times in an interview setting the question also requires you to report back the start and end points of the sum. Keep this in mind and see if you can solve that problem, we'll see it in the mock interview section of the course!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "from nose.tools import assert_equal\n", - "\n", - "class LargeContTest(object):\n", - " def test(self,sol):\n", - " assert_equal(sol([1,2,-1,3,4,-1]),9)\n", - " assert_equal(sol([1,2,-1,3,4,10,10,-10,-1]),29)\n", - " assert_equal(sol([-1,1]),1)\n", - " print ('ALL TEST CASES PASSED')\n", - " \n", - "#Run Test\n", - "t = LargeContTest()\n", - "t.test(large_cont_sum)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Sentence Reversal.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Sentence Reversal.ipynb deleted file mode 100644 index f1ce5f7a..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/Sentence Reversal.ipynb +++ /dev/null @@ -1,220 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Sentence Reversal\n", - "\n", - "## Problem\n", - "\n", - "Given a string of words, reverse all the words. For example:\n", - "\n", - "Given:\n", - " \n", - " 'This is the best'\n", - "\n", - "Return:\n", - "\n", - " 'best the is This'\n", - "\n", - "As part of this exercise you should remove all leading and trailing whitespace. So that inputs such as:\n", - "\n", - " ' space here' and 'space here '\n", - "\n", - "both become:\n", - "\n", - " 'here space'\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "def rev_word(s):\n", - " return \" \".join(reversed(s.split()))\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'go? to ready you are John, Hi'" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word('Hi John, are you ready to go?')" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'before space'" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word(' space before')" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'after space'" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word('space after ')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Learn\n", - "- \" \".join()\n", - "- reversed()\n", - "- s.split()" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'\\nInit signature: reversed(self, /, *args, **kwargs)\\nDocstring: \\nreversed(sequence) -> reverse iterator over values of the sequence\\n\\nReturn a reverse iterator\\nType: type\\n'" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# reversed()\n", - "'''\n", - "Init signature: reversed(self, /, *args, **kwargs)\n", - "Docstring: \n", - "reversed(sequence) -> reverse iterator over values of the sequence\n", - "\n", - "Return a reverse iterator\n", - "Type: type\n", - "'''" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "_____" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class ReversalTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(' space before'),'before space')\n", - " assert_equal(sol('space after '),'after space')\n", - " assert_equal(sol(' Hello John how are you '),'you are how John Hello')\n", - " assert_equal(sol('1'),'1')\n", - " print (\"ALL TEST CASES PASSED\")\n", - " \n", - "# Run and test\n", - "t = ReversalTest()\n", - "t.test(rev_word)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/String Compression .ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/String Compression .ipynb deleted file mode 100644 index 00ca41f5..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - PRACTICE/String Compression .ipynb +++ /dev/null @@ -1,143 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# String Compression\n", - "\n", - "## Problem\n", - "\n", - "Given a string in the form 'AAAABBBBCCCCCDDEEEE' compress it to become 'A4B4C5D2E4'. For this problem, you can falsely \"compress\" strings of single or double letters. For instance, it is okay for 'AAB' to return 'A2B1' even though this technically takes more space. \n", - "\n", - "The function should also be case sensitive, so that a string 'AAAaaa' returns 'A3a3'." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def compress(s):\n", - " r = \"\"\n", - " l = len(s)\n", - " \n", - " if l==0:\n", - " return ''\n", - " if l==1:\n", - " return s+'1'\n", - " \n", - " last = s[0]\n", - " cnt = 1\n", - " i=1\n", - " \n", - " while i\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "\n", - "class TestUnique(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), True)\n", - " assert_equal(sol('goo'), False)\n", - " assert_equal(sol('abcdefg'), True)\n", - " print ('ALL TEST CASES PASSED')\n", - " \n", - "# Run Tests\n", - "t = TestUnique()\n", - "t.test(uni_char)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Anagram Check - SOLUTION-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Anagram Check - SOLUTION-checkpoint.ipynb deleted file mode 100644 index bff6a2f4..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Anagram Check - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,330 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Anagram Solution\n", - "\n", - "## Problem\n", - "\n", - "Given two strings, check to see if they are anagrams. An anagram is when the two strings can be written using the exact same letters (so you can just rearrange the letters to get a different phrase or word). \n", - "\n", - "For example:\n", - "\n", - " \"public relations\" is an anagram of \"crap built on lies.\"\n", - " \n", - " \"clint eastwood\" is an anagram of \"old west action\"\n", - " \n", - "**Note: Ignore spaces and capitalization. So \"d go\" is an anagram of \"God\" and \"dog\" and \"o d g\".**\n", - "\n", - "## Solution\n", - "\n", - "There are two ways of thinking about this problem, if two strings have the same frequency of letters/element (meaning each letter shows up the same number of times in both strings) then they are anagrams of eachother. On a similar vien of logic, if two strings are equal to each other once they are sorted, then they are also anagrams of each other.\n", - "\n", - "You would be able to implement this second solution pretty easily in Python:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def anagram(s1,s2):\n", - " \n", - " # Remove spaces and lowercase letters\n", - " s1 = s1.replace(' ','').lower()\n", - " s2 = s2.replace(' ','').lower()\n", - " \n", - " # Return boolean for sorted match.\n", - " return sorted(s1) == sorted(s2)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('dog','god')" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('clint eastwood','old west action')" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('aa','bb')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now the above sorting approach is simple, but is actually not optimal and in an interview setting you would probably be asked to implement a more manual solution involving just counting the number of letters in each string to test your ability to understand hash tables. Let's build out a fuller solution using counting and Python dictionaries:" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def anagram2(s1,s2):\n", - " \n", - " # Remove spaces and lowercase letters\n", - " s1 = s1.replace(' ','').lower()\n", - " s2 = s2.replace(' ','').lower()\n", - " \n", - " # Edge Case to check if same number of letters\n", - " if len(s1) != len(s2):\n", - " return False\n", - " \n", - " # Create counting dictionary (Note could use DefaultDict from Collections module)\n", - " count = {}\n", - " \n", - " \n", - " \n", - " # Fill dictionary for first string (add counts)\n", - " for letter in s1:\n", - " if letter in count:\n", - " count[letter] += 1\n", - " else:\n", - " count[letter] = 1\n", - " \n", - " # Fill dictionary for second string (subtract counts)\n", - " for letter in s2:\n", - " if letter in count:\n", - " count[letter] -= 1\n", - " else:\n", - " count[letter] = 1\n", - " \n", - " # Check that all counts are 0\n", - " for k in count:\n", - " if count[k] != 0:\n", - " return False\n", - "\n", - " # Otherwise they're anagrams\n", - " return True" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram2('dog','god')" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram2('clint eastwood','old west action')" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram2('dd','aa')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A quick note on the second solution, the use of defaultdict form the collections module would clean up this code quite a bit, and the final for loop could be built into the second for loop, but in the above implementation every step is very clear." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "Run the cell below to test your solution" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class AnagramTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol('go go go','gggooo'),True)\n", - " assert_equal(sol('abc','cba'),True)\n", - " assert_equal(sol('hi man','hi man'),True)\n", - " assert_equal(sol('aabbcc','aabbc'),False)\n", - " assert_equal(sol('123','1 2'),False)\n", - " print \"ALL TEST CASES PASSED\"\n", - "\n", - "# Run Tests\n", - "t = AnagramTest()\n", - "t.test(anagram)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "t.test(anagram2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Array Pair Sum - SOLUTION-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Array Pair Sum - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 2419f818..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Array Pair Sum - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,162 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Array Pair Sum\n", - "\n", - "## Problem\n", - "\n", - "Given an integer array, output all the ** *unique* ** pairs that sum up to a specific value **k**.\n", - "\n", - "So the input:\n", - " \n", - " pair_sum([1,3,2,2],4)\n", - "\n", - "would return **2** pairs:\n", - "\n", - " (1,3)\n", - " (2,2)\n", - "\n", - "**NOTE: FOR TESTING PURPOSES< CHANGE YOUR FUNCTION SO IT OUTPUTS THE NUMBER OF PAIRS**\n", - "\n", - "## Solution\n", - "\n", - "The O(N) algorithm uses the set data structure. We perform a linear pass from the beginning and for each element we check whether k-element is in the set of seen numbers. If it is, then we found a pair of sum k and add it to the output. If not, this element doesn’t belong to a pair yet, and we add it to the set of seen elements. \n", - "\n", - "The algorithm is really simple once we figure out using a set. The complexity is O(N) because we do a single linear scan of the array, and for each element we just check whether the corresponding number to form a pair is in the set or add the current element to the set. Insert and find operations of a set are both average O(1), so the algorithm is O(N) in total. " - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def pair_sum(arr,k):\n", - " \n", - " if len(arr)<2:\n", - " return\n", - " \n", - " # Sets for tracking\n", - " seen = set()\n", - " output = set()\n", - " \n", - " # For every number in array\n", - " for num in arr:\n", - " \n", - " # Set target difference\n", - " target = k-num\n", - " \n", - " # Add it to set if target hasn't been seen\n", - " if target not in seen:\n", - " seen.add(num)\n", - " \n", - " else:\n", - " # Add a tuple with the corresponding pair\n", - " output.add( (min(num,target), max(num,target)) )\n", - " \n", - " \n", - " # FOR TESTING\n", - " return len(output)\n", - " # Nice one-liner for printing output\n", - " #return '\\n'.join(map(str,list(output)))" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pair_sum([1,3,2,2],4)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestPair(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol([1,9,2,8,3,7,4,6,5,5,13,14,11,13,-1],10),6)\n", - " assert_equal(sol([1,2,3,1],3),1)\n", - " assert_equal(sol([1,3,2,2],4),2)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "#Run tests\n", - "t = TestPair()\n", - "t.test(pair_sum)\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Find the Missing Element - SOLUTION-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Find the Missing Element - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 0b216746..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Find the Missing Element - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,272 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Find the Missing Element\n", - "\n", - "## Problem\n", - "\n", - "Consider an array of non-negative integers. A second array is formed by shuffling the elements of the first array and deleting a random element. Given these two arrays, find which element is missing in the second array. \n", - "\n", - "Here is an example input, the first array is shuffled and the number 5 is removed to construct the second array.\n", - "\n", - "Input:\n", - " \n", - " finder([1,2,3,4,5,6,7],[3,7,2,1,4,6])\n", - "\n", - "Output:\n", - "\n", - " 5 is the missing number\n", - "\n", - "## Solution\n", - "\n", - "The naive solution is go through every element in the second array and check whether it appears in the first array. Note that there may be duplicate elements in the arrays so we should pay special attention to it. The complexity of this approach is O(N^2), since we would need two for loops.\n", - "\n", - "A more efficient solution is to sort the first array, so while checking whether an element in the first array appears in the second, we can do binary search (we'll learn about binary search in more detail in a future section). But we should still be careful about duplicate elements. The complexity is O(NlogN). \n", - "\n", - "If we don’t want to deal with the special case of duplicate numbers, we can sort both arrays and iterate over them simultaneously. Once two iterators have different values we can stop. The value of the first iterator is the missing element. This solution is also O(NlogN). Here is the solution for this approach:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def finder(arr1,arr2):\n", - " \n", - " # Sort the arrays\n", - " arr1.sort()\n", - " arr2.sort()\n", - " \n", - " # Compare elements in the sorted arrays\n", - " for num1, num2 in zip(arr1,arr2):\n", - " if num1!= num2:\n", - " return num1\n", - " \n", - " # Otherwise return last element\n", - " return arr1[-1]" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = [1,2,3,4,5,6,7]\n", - "arr2 = [3,7,2,1,4,6]\n", - "finder(arr1,arr2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In most interviews, you would be expected to come up with a linear time solution. We can use a hashtable and store the number of times each element appears in the second array. Then for each element in the first array we decrement its counter. Once hit an element with zero count that’s the missing element. Here is this solution: " - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import collections\n", - "\n", - "def finder2(arr1, arr2): \n", - " \n", - " # Using default dict to avoid key errors\n", - " d=collections.defaultdict(int) \n", - " \n", - " # Add a count for every instance in Array 1\n", - " for num in arr2:\n", - " d[num]+=1 \n", - " \n", - " # Check if num not in dictionary\n", - " for num in arr1: \n", - " if d[num]==0: \n", - " return num \n", - " \n", - " # Otherwise, subtract a count\n", - " else: d[num]-=1 " - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = [5,5,7,7]\n", - "arr2 = [5,7,7]\n", - "\n", - "finder2(arr1,arr2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One possible solution is computing the sum of all the numbers in arr1 and arr2, and subtracting arr2’s sum from array1’s sum. The difference is the missing number in arr2. However, this approach could be problematic if the arrays are too long, or the numbers are very large. Then overflow will occur while summing up the numbers.\n", - "\n", - "By performing a very clever trick, we can achieve linear time and constant space complexity without any problems. Here it is: initialize a variable to 0, then [XOR](https://en.wikipedia.org/wiki/Exclusive_or) every element in the first and second arrays with that variable. In the end, the value of the variable is the result, missing element in array2." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def finder3(arr1, arr2): \n", - " result=0 \n", - " \n", - " # Perform an XOR between the numbers in the arrays\n", - " for num in arr1+arr2: \n", - " result^=num \n", - " print result\n", - " \n", - " return result " - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "5\n", - "0\n", - "7\n", - "0\n", - "5\n", - "2\n", - "5\n" - ] - }, - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "finder3(arr1,arr2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestFinder(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol([5,5,7,7],[5,7,7]),5)\n", - " assert_equal(sol([1,2,3,4,5,6,7],[3,7,2,1,4,6]),5)\n", - " assert_equal(sol([9,8,7,6,5,4,3,2,1],[9,8,7,5,4,3,2,1]),6)\n", - " print 'ALL TEST CASES PASSED'\n", - "\n", - "# Run test\n", - "t = TestFinder()\n", - "t.test(finder)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Largest Continuous Sum - SOLUTION-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Largest Continuous Sum - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 153410ab..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Largest Continuous Sum - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,146 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Largest Continuous Sum\n", - "\n", - "## Problem\n", - "Given an array of integers (positive and negative) find the largest continuous sum. \n", - "\n", - "## Solution\n", - "\n", - "If the array is all positive, then the result is simply the sum of all numbers. The negative numbers in the array will cause us to need to begin checking sequences. \n", - "\n", - "The algorithm is, we start summing up the numbers and store in a current sum variable. After adding each element, we check whether the current sum is larger than maximum sum encountered so far. If it is, we update the maximum sum. As long as the current sum is positive, we keep adding the numbers. When the current sum becomes negative, we start with a new current sum. Because a negative current sum will only decrease the sum of a future sequence. Note that we don’t reset the current sum to 0 because the array can contain all negative integers. Then the result would be the largest negative number. \n", - "\n", - "Let's see the code:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def large_cont_sum(arr): \n", - " \n", - " # Check to see if array is length 0\n", - " if len(arr)==0: \n", - " return 0\n", - " \n", - " # Start the max and current sum at the first element\n", - " max_sum=current_sum=arr[0] \n", - " \n", - " # For every element in array\n", - " for num in arr[1:]: \n", - " \n", - " # Set current sum as the higher of the two\n", - " current_sum=max(current_sum+num, num)\n", - " \n", - " # Set max as the higher between the currentSum and the current max\n", - " max_sum=max(current_sum, max_sum) \n", - " \n", - " return max_sum " - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "29" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "large_cont_sum([1,2,-1,3,4,10,10,-10,-1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "Many times in an interview setting the question also requires you to report back the start and end points of the sum. Keep this in mind and see if you can solve that problem, we'll see it in the mock interview section of the course!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "from nose.tools import assert_equal\n", - "\n", - "class LargeContTest(object):\n", - " def test(self,sol):\n", - " assert_equal(sol([1,2,-1,3,4,-1]),9)\n", - " assert_equal(sol([1,2,-1,3,4,10,10,-10,-1]),29)\n", - " assert_equal(sol([-1,1]),1)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "#Run Test\n", - "t = LargeContTest()\n", - "t.test(large_cont_sum)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Sentence Reversal - SOLUTION-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Sentence Reversal - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 6a78183c..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Sentence Reversal - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,267 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Sentence Reversal\n", - "\n", - "## Problem\n", - "\n", - "Given a string of words, reverse all the words. For example:\n", - "\n", - "Given:\n", - " \n", - " 'This is the best'\n", - "\n", - "Return:\n", - "\n", - " 'best the is This'\n", - "\n", - "As part of this exercise you should remove all leading and trailing whitespace. So that inputs such as:\n", - "\n", - " ' space here' and 'space here '\n", - "\n", - "both become:\n", - "\n", - " 'here space'\n", - "\n", - "## Solution\n", - "\n", - "We could take advantage of Python's abilities and solve the problem with the use of **split()** and some slicing or use of **reversed**:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def rev_word1(s):\n", - " return \" \".join(reversed(s.split()))\n", - "\n", - "#Or\n", - "\n", - "def rev_word2(s):\n", - " return \" \".join(s.split()[::-1])" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'go? to ready you are John, Hi'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word1('Hi John, are you ready to go?')" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'go? to ready you are John, Hi'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word2('Hi John, are you ready to go?')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "While these are valid solutions, in an interview setting you'll have to work out the basic algorithm that is used. In this case what we want to do is loop over the text and extract words form the string ourselves. Then we can push the words to a \"stack\" and in the end opo them all to reverse. Let's see what this actually looks like:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def rev_word3(s):\n", - " \"\"\"\n", - " Manually doing the splits on the spaces.\n", - " \"\"\"\n", - " \n", - " words = []\n", - " length = len(s)\n", - " spaces = [' ']\n", - " \n", - " # Index Tracker\n", - " i = 0\n", - " \n", - " # While index is less than length of string\n", - " while i < length:\n", - " \n", - " # If element isn't a space\n", - " if s[i] not in spaces:\n", - " \n", - " # The word starts at this index\n", - " word_start = i\n", - " \n", - " while i < length and s[i] not in spaces:\n", - " \n", - " # Get index where word ends\n", - " i += 1\n", - " # Append that word to the list\n", - " words.append(s[word_start:i])\n", - " # Add to index\n", - " i += 1\n", - " \n", - " # Join the reversed words\n", - " return \" \".join(reversed(words))" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'you are how John Hello'" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word3(' Hello John how are you ')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'before space'" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word3(' space before')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you want you can further develop this solution so its all manual, you can create your own reversal function." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class ReversalTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(' space before'),'before space')\n", - " assert_equal(sol('space after '),'after space')\n", - " assert_equal(sol(' Hello John how are you '),'you are how John Hello')\n", - " assert_equal(sol('1'),'1')\n", - " print \"ALL TEST CASES PASSED\"\n", - " \n", - "# Run and test\n", - "t = ReversalTest()\n", - "t.test(rev_word)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/String Compression -SOLUTION-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/String Compression -SOLUTION-checkpoint.ipynb deleted file mode 100644 index 629aafd8..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/String Compression -SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,168 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# String Compression\n", - "\n", - "## Problem\n", - "\n", - "Given a string in the form 'AAAABBBBCCCCCDDEEEE' compress it to become 'A4B4C5D2E4'. For this problem, you can falsely \"compress\" strings of single or double letters. For instance, it is okay for 'AAB' to return 'A2B1' even though this technically takes more space. \n", - "\n", - "The function should also be case sensitive, so that a string 'AAAaaa' returns 'A3a3'." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Since Python strings are immutable, we'll need to work off of a list of characters, and at the end convert that list back into a string with a **join** statement.\n", - "\n", - "The solution below should yield us with a Time and Space complexity of O(n). Let's take a look with careful attention to the explanatory comments:" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def compress(s):\n", - " \"\"\"\n", - " This solution compresses without checking. Known as the RunLength Compression algorithm.\n", - " \"\"\"\n", - " \n", - " # Begin Run as empty string\n", - " r = \"\"\n", - " l = len(s)\n", - " \n", - " # Check for length 0\n", - " if l == 0:\n", - " return \"\"\n", - " \n", - " # Check for length 1\n", - " if l == 1:\n", - " return s + \"1\"\n", - " \n", - " #Intialize Values\n", - " last = s[0]\n", - " cnt = 1\n", - " i = 1\n", - " \n", - " while i < l:\n", - " \n", - " # Check to see if it is the same letter\n", - " if s[i] == s[i - 1]: \n", - " # Add a count if same as previous\n", - " cnt += 1\n", - " else:\n", - " # Otherwise store the previous data\n", - " r = r + s[i - 1] + str(cnt)\n", - " cnt = 1\n", - " \n", - " # Add to index count to terminate while loop\n", - " i += 1\n", - " \n", - " # Put everything back into run\n", - " r = r + s[i - 1] + str(cnt)\n", - " \n", - " return r" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'A5B4C4'" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compress('AAAAABBBBCCCC')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestCompress(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), '')\n", - " assert_equal(sol('AABBCC'), 'A2B2C2')\n", - " assert_equal(sol('AAABCCDDDDD'), 'A3B1C2D5')\n", - " print 'ALL TEST CASES PASSED'\n", - "\n", - "# Run Tests\n", - "t = TestCompress()\n", - "t.test(compress)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Unique Characters in String - SOLUTION-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Unique Characters in String - SOLUTION-checkpoint.ipynb deleted file mode 100644 index c93f14c1..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/.ipynb_checkpoints/Unique Characters in String - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,124 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Unique Characters in String\n", - "\n", - "## Problem\n", - "Given a string,determine if it is compreised of all unique characters. For example, the string 'abcde' has all unique characters and should return True. The string 'aabcde' contains duplicate characters and should return false." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "We'll show two possible solutions, one using a built-in data structure and a built in function, and another using a built-in data structure but using a look-up method to check if the characters are unique." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def uni_char(s):\n", - " return len(set(s)) == len(s)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def uni_char2(s):\n", - " chars = set()\n", - " for let in s:\n", - " # Check if in set\n", - " if let in chars:\n", - " return False\n", - " else:\n", - " #Add it to the set\n", - " chars.add(let)\n", - " return True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR CODE>\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "\n", - "class TestUnique(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), True)\n", - " assert_equal(sol('goo'), False)\n", - " assert_equal(sol('abcdefg'), True)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run Tests\n", - "t = TestUnique()\n", - "t.test(uni_char)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Anagram Check - SOLUTION.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Anagram Check - SOLUTION.ipynb deleted file mode 100644 index 91e7d3d2..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Anagram Check - SOLUTION.ipynb +++ /dev/null @@ -1,310 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Anagram Solution\n", - "\n", - "## Problem\n", - "\n", - "Given two strings, check to see if they are anagrams. An anagram is when the two strings can be written using the exact same letters (so you can just rearrange the letters to get a different phrase or word). \n", - "\n", - "For example:\n", - "\n", - " \"public relations\" is an anagram of \"crap built on lies.\"\n", - " \n", - " \"clint eastwood\" is an anagram of \"old west action\"\n", - " \n", - "**Note: Ignore spaces and capitalization. So \"d go\" is an anagram of \"God\" and \"dog\" and \"o d g\".**\n", - "\n", - "## Solution\n", - "\n", - "There are two ways of thinking about this problem, if two strings have the same frequency of letters/element (meaning each letter shows up the same number of times in both strings) then they are anagrams of eachother. On a similar vien of logic, if two strings are equal to each other once they are sorted, then they are also anagrams of each other.\n", - "\n", - "You would be able to implement this second solution pretty easily in Python:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "def anagram(s1,s2):\n", - " \n", - " # Remove spaces and lowercase letters\n", - " s1 = s1.replace(' ','').lower()\n", - " s2 = s2.replace(' ','').lower()\n", - " \n", - " # Return boolean for sorted match.\n", - " return sorted(s1) == sorted(s2)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('dog','god')" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('clint eastwood','old west action')" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('aa','bb')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now the above sorting approach is simple, but is actually not optimal and in an interview setting you would probably be asked to implement a more manual solution involving just counting the number of letters in each string to test your ability to understand hash tables. Let's build out a fuller solution using counting and Python dictionaries:" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "def anagram2(s1,s2):\n", - " \n", - " # Remove spaces and lowercase letters\n", - " s1 = s1.replace(' ','').lower()\n", - " s2 = s2.replace(' ','').lower()\n", - " \n", - " # Edge Case to check if same number of letters\n", - " if len(s1) != len(s2):\n", - " return False\n", - " \n", - " # Create counting dictionary (Note could use DefaultDict from Collections module)\n", - " count = {}\n", - " \n", - " \n", - " \n", - " # Fill dictionary for first string (add counts)\n", - " for letter in s1:\n", - " if letter in count:\n", - " count[letter] += 1\n", - " else:\n", - " count[letter] = 1\n", - " \n", - " # Fill dictionary for second string (subtract counts)\n", - " for letter in s2:\n", - " if letter in count:\n", - " count[letter] -= 1\n", - " else:\n", - " count[letter] = 1\n", - " \n", - " # Check that all counts are 0\n", - " for k in count:\n", - " if count[k] != 0:\n", - " return False\n", - "\n", - " # Otherwise they're anagrams\n", - " return True" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram2('dog','god')" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram2('clint eastwood','old west action')" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram2('dd','aa')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A quick note on the second solution, the use of defaultdict form the collections module would clean up this code quite a bit, and the final for loop could be built into the second for loop, but in the above implementation every step is very clear." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "Run the cell below to test your solution" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class AnagramTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol('go go go','gggooo'),True)\n", - " assert_equal(sol('abc','cba'),True)\n", - " assert_equal(sol('hi man','hi man'),True)\n", - " assert_equal(sol('aabbcc','aabbc'),False)\n", - " assert_equal(sol('123','1 2'),False)\n", - " print \"ALL TEST CASES PASSED\"\n", - "\n", - "# Run Tests\n", - "t = AnagramTest()\n", - "t.test(anagram)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "t.test(anagram2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Array Pair Sum - SOLUTION.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Array Pair Sum - SOLUTION.ipynb deleted file mode 100644 index 2419f818..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Array Pair Sum - SOLUTION.ipynb +++ /dev/null @@ -1,162 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Array Pair Sum\n", - "\n", - "## Problem\n", - "\n", - "Given an integer array, output all the ** *unique* ** pairs that sum up to a specific value **k**.\n", - "\n", - "So the input:\n", - " \n", - " pair_sum([1,3,2,2],4)\n", - "\n", - "would return **2** pairs:\n", - "\n", - " (1,3)\n", - " (2,2)\n", - "\n", - "**NOTE: FOR TESTING PURPOSES< CHANGE YOUR FUNCTION SO IT OUTPUTS THE NUMBER OF PAIRS**\n", - "\n", - "## Solution\n", - "\n", - "The O(N) algorithm uses the set data structure. We perform a linear pass from the beginning and for each element we check whether k-element is in the set of seen numbers. If it is, then we found a pair of sum k and add it to the output. If not, this element doesn’t belong to a pair yet, and we add it to the set of seen elements. \n", - "\n", - "The algorithm is really simple once we figure out using a set. The complexity is O(N) because we do a single linear scan of the array, and for each element we just check whether the corresponding number to form a pair is in the set or add the current element to the set. Insert and find operations of a set are both average O(1), so the algorithm is O(N) in total. " - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def pair_sum(arr,k):\n", - " \n", - " if len(arr)<2:\n", - " return\n", - " \n", - " # Sets for tracking\n", - " seen = set()\n", - " output = set()\n", - " \n", - " # For every number in array\n", - " for num in arr:\n", - " \n", - " # Set target difference\n", - " target = k-num\n", - " \n", - " # Add it to set if target hasn't been seen\n", - " if target not in seen:\n", - " seen.add(num)\n", - " \n", - " else:\n", - " # Add a tuple with the corresponding pair\n", - " output.add( (min(num,target), max(num,target)) )\n", - " \n", - " \n", - " # FOR TESTING\n", - " return len(output)\n", - " # Nice one-liner for printing output\n", - " #return '\\n'.join(map(str,list(output)))" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pair_sum([1,3,2,2],4)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestPair(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol([1,9,2,8,3,7,4,6,5,5,13,14,11,13,-1],10),6)\n", - " assert_equal(sol([1,2,3,1],3),1)\n", - " assert_equal(sol([1,3,2,2],4),2)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "#Run tests\n", - "t = TestPair()\n", - "t.test(pair_sum)\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Find the Missing Element - SOLUTION.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Find the Missing Element - SOLUTION.ipynb deleted file mode 100644 index 0b216746..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Find the Missing Element - SOLUTION.ipynb +++ /dev/null @@ -1,272 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Find the Missing Element\n", - "\n", - "## Problem\n", - "\n", - "Consider an array of non-negative integers. A second array is formed by shuffling the elements of the first array and deleting a random element. Given these two arrays, find which element is missing in the second array. \n", - "\n", - "Here is an example input, the first array is shuffled and the number 5 is removed to construct the second array.\n", - "\n", - "Input:\n", - " \n", - " finder([1,2,3,4,5,6,7],[3,7,2,1,4,6])\n", - "\n", - "Output:\n", - "\n", - " 5 is the missing number\n", - "\n", - "## Solution\n", - "\n", - "The naive solution is go through every element in the second array and check whether it appears in the first array. Note that there may be duplicate elements in the arrays so we should pay special attention to it. The complexity of this approach is O(N^2), since we would need two for loops.\n", - "\n", - "A more efficient solution is to sort the first array, so while checking whether an element in the first array appears in the second, we can do binary search (we'll learn about binary search in more detail in a future section). But we should still be careful about duplicate elements. The complexity is O(NlogN). \n", - "\n", - "If we don’t want to deal with the special case of duplicate numbers, we can sort both arrays and iterate over them simultaneously. Once two iterators have different values we can stop. The value of the first iterator is the missing element. This solution is also O(NlogN). Here is the solution for this approach:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def finder(arr1,arr2):\n", - " \n", - " # Sort the arrays\n", - " arr1.sort()\n", - " arr2.sort()\n", - " \n", - " # Compare elements in the sorted arrays\n", - " for num1, num2 in zip(arr1,arr2):\n", - " if num1!= num2:\n", - " return num1\n", - " \n", - " # Otherwise return last element\n", - " return arr1[-1]" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = [1,2,3,4,5,6,7]\n", - "arr2 = [3,7,2,1,4,6]\n", - "finder(arr1,arr2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In most interviews, you would be expected to come up with a linear time solution. We can use a hashtable and store the number of times each element appears in the second array. Then for each element in the first array we decrement its counter. Once hit an element with zero count that’s the missing element. Here is this solution: " - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import collections\n", - "\n", - "def finder2(arr1, arr2): \n", - " \n", - " # Using default dict to avoid key errors\n", - " d=collections.defaultdict(int) \n", - " \n", - " # Add a count for every instance in Array 1\n", - " for num in arr2:\n", - " d[num]+=1 \n", - " \n", - " # Check if num not in dictionary\n", - " for num in arr1: \n", - " if d[num]==0: \n", - " return num \n", - " \n", - " # Otherwise, subtract a count\n", - " else: d[num]-=1 " - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = [5,5,7,7]\n", - "arr2 = [5,7,7]\n", - "\n", - "finder2(arr1,arr2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One possible solution is computing the sum of all the numbers in arr1 and arr2, and subtracting arr2’s sum from array1’s sum. The difference is the missing number in arr2. However, this approach could be problematic if the arrays are too long, or the numbers are very large. Then overflow will occur while summing up the numbers.\n", - "\n", - "By performing a very clever trick, we can achieve linear time and constant space complexity without any problems. Here it is: initialize a variable to 0, then [XOR](https://en.wikipedia.org/wiki/Exclusive_or) every element in the first and second arrays with that variable. In the end, the value of the variable is the result, missing element in array2." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def finder3(arr1, arr2): \n", - " result=0 \n", - " \n", - " # Perform an XOR between the numbers in the arrays\n", - " for num in arr1+arr2: \n", - " result^=num \n", - " print result\n", - " \n", - " return result " - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "5\n", - "0\n", - "7\n", - "0\n", - "5\n", - "2\n", - "5\n" - ] - }, - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "finder3(arr1,arr2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestFinder(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol([5,5,7,7],[5,7,7]),5)\n", - " assert_equal(sol([1,2,3,4,5,6,7],[3,7,2,1,4,6]),5)\n", - " assert_equal(sol([9,8,7,6,5,4,3,2,1],[9,8,7,5,4,3,2,1]),6)\n", - " print 'ALL TEST CASES PASSED'\n", - "\n", - "# Run test\n", - "t = TestFinder()\n", - "t.test(finder)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Largest Continuous Sum - SOLUTION.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Largest Continuous Sum - SOLUTION.ipynb deleted file mode 100644 index f5fd1e30..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Largest Continuous Sum - SOLUTION.ipynb +++ /dev/null @@ -1,140 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Largest Continuous Sum\n", - "\n", - "## Problem\n", - "Given an array of integers (positive and negative) find the largest continuous sum. \n", - "\n", - "## Solution\n", - "\n", - "If the array is all positive, then the result is simply the sum of all numbers. The negative numbers in the array will cause us to need to begin checking sequences. \n", - "\n", - "The algorithm is, we start summing up the numbers and store in a current sum variable. After adding each element, we check whether the current sum is larger than maximum sum encountered so far. If it is, we update the maximum sum. As long as the current sum is positive, we keep adding the numbers. When the current sum becomes negative, we start with a new current sum. Because a negative current sum will only decrease the sum of a future sequence. Note that we don’t reset the current sum to 0 because the array can contain all negative integers. Then the result would be the largest negative number. \n", - "\n", - "Let's see the code:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def large_cont_sum(arr): \n", - " \n", - " # Check to see if array is length 0\n", - " if len(arr)==0: \n", - " return 0\n", - " \n", - " # Start the max and current sum at the first element\n", - " max_sum=current_sum=arr[0] \n", - " \n", - " # For every element in array\n", - " for num in arr[1:]: \n", - " \n", - " # Set current sum as the higher of the two\n", - " current_sum=max(current_sum+num, num)\n", - " \n", - " # Set max as the higher between the currentSum and the current max\n", - " max_sum=max(current_sum, max_sum) \n", - " \n", - " return max_sum " - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "29" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "large_cont_sum([1,2,-1,3,4,10,10,-10,-1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "Many times in an interview setting the question also requires you to report back the start and end points of the sum. Keep this in mind and see if you can solve that problem, we'll see it in the mock interview section of the course!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "from nose.tools import assert_equal\n", - "\n", - "class LargeContTest(object):\n", - " def test(self,sol):\n", - " assert_equal(sol([1,2,-1,3,4,-1]),9)\n", - " assert_equal(sol([1,2,-1,3,4,10,10,-10,-1]),29)\n", - " assert_equal(sol([-1,1]),1)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "#Run Test\n", - "t = LargeContTest()\n", - "t.test(large_cont_sum)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Sentence Reversal - SOLUTION.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Sentence Reversal - SOLUTION.ipynb deleted file mode 100644 index 0e6577a7..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Sentence Reversal - SOLUTION.ipynb +++ /dev/null @@ -1,257 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Sentence Reversal\n", - "\n", - "## Problem\n", - "\n", - "Given a string of words, reverse all the words. For example:\n", - "\n", - "Given:\n", - " \n", - " 'This is the best'\n", - "\n", - "Return:\n", - "\n", - " 'best the is This'\n", - "\n", - "As part of this exercise you should remove all leading and trailing whitespace. So that inputs such as:\n", - "\n", - " ' space here' and 'space here '\n", - "\n", - "both become:\n", - "\n", - " 'here space'\n", - "\n", - "## Solution\n", - "\n", - "We could take advantage of Python's abilities and solve the problem with the use of **split()** and some slicing or use of **reversed**:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def rev_word1(s):\n", - " return \" \".join(reversed(s.split()))\n", - "\n", - "#Or\n", - "\n", - "def rev_word2(s):\n", - " return \" \".join(s.split()[::-1])" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'go? to ready you are John, Hi'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word1('Hi John, are you ready to go?')" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'go? to ready you are John, Hi'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word2('Hi John, are you ready to go?')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "While these are valid solutions, in an interview setting you'll have to work out the basic algorithm that is used. In this case what we want to do is loop over the text and extract words form the string ourselves. Then we can push the words to a \"stack\" and in the end opo them all to reverse. Let's see what this actually looks like:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def rev_word3(s):\n", - " \"\"\"\n", - " Manually doing the splits on the spaces.\n", - " \"\"\"\n", - " \n", - " words = []\n", - " length = len(s)\n", - " spaces = [' ']\n", - " \n", - " # Index Tracker\n", - " i = 0\n", - " \n", - " # While index is less than length of string\n", - " while i < length:\n", - " \n", - " # If element isn't a space\n", - " if s[i] not in spaces:\n", - " \n", - " # The word starts at this index\n", - " word_start = i\n", - " \n", - " while i < length and s[i] not in spaces:\n", - " \n", - " # Get index where word ends\n", - " i += 1\n", - " # Append that word to the list\n", - " words.append(s[word_start:i])\n", - " # Add to index\n", - " i += 1\n", - " \n", - " # Join the reversed words\n", - " return \" \".join(reversed(words))" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'you are how John Hello'" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word3(' Hello John how are you ')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'before space'" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word3(' space before')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you want you can further develop this solution so its all manual, you can create your own reversal function." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class ReversalTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(' space before'),'before space')\n", - " assert_equal(sol('space after '),'after space')\n", - " assert_equal(sol(' Hello John how are you '),'you are how John Hello')\n", - " assert_equal(sol('1'),'1')\n", - " print \"ALL TEST CASES PASSED\"\n", - " \n", - "# Run and test\n", - "t = ReversalTest()\n", - "t.test(rev_word)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/String Compression -SOLUTION.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/String Compression -SOLUTION.ipynb deleted file mode 100644 index 68411f20..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/String Compression -SOLUTION.ipynb +++ /dev/null @@ -1,162 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# String Compression\n", - "\n", - "## Problem\n", - "\n", - "Given a string in the form 'AAAABBBBCCCCCDDEEEE' compress it to become 'A4B4C5D2E4'. For this problem, you can falsely \"compress\" strings of single or double letters. For instance, it is okay for 'AAB' to return 'A2B1' even though this technically takes more space. \n", - "\n", - "The function should also be case sensitive, so that a string 'AAAaaa' returns 'A3a3'." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Since Python strings are immutable, we'll need to work off of a list of characters, and at the end convert that list back into a string with a **join** statement.\n", - "\n", - "The solution below should yield us with a Time and Space complexity of O(n). Let's take a look with careful attention to the explanatory comments:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "def compress(s):\n", - " \"\"\"\n", - " This solution compresses without checking. Known as the RunLength Compression algorithm.\n", - " \"\"\"\n", - " \n", - " # Begin Run as empty string\n", - " r = \"\"\n", - " l = len(s)\n", - " \n", - " # Check for length 0\n", - " if l == 0:\n", - " return \"\"\n", - " \n", - " # Check for length 1\n", - " if l == 1:\n", - " return s + \"1\"\n", - " \n", - " #Intialize Values\n", - " last = s[0]\n", - " cnt = 1\n", - " i = 1\n", - " \n", - " while i < l:\n", - " \n", - " # Check to see if it is the same letter\n", - " if s[i] == s[i - 1]: \n", - " # Add a count if same as previous\n", - " cnt += 1\n", - " else:\n", - " # Otherwise store the previous data\n", - " r = r + s[i - 1] + str(cnt)\n", - " cnt = 1\n", - " \n", - " # Add to index count to terminate while loop\n", - " i += 1\n", - " \n", - " # Put everything back into run\n", - " r = r + s[i - 1] + str(cnt)\n", - " \n", - " return r" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A5B4C4'" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compress('AAAAABBBBCCCC')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestCompress(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), '')\n", - " assert_equal(sol('AABBCC'), 'A2B2C2')\n", - " assert_equal(sol('AAABCCDDDDD'), 'A3B1C2D5')\n", - " print 'ALL TEST CASES PASSED'\n", - "\n", - "# Run Tests\n", - "t = TestCompress()\n", - "t.test(compress)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Unique Characters in String - SOLUTION.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Unique Characters in String - SOLUTION.ipynb deleted file mode 100644 index 4b18c4c4..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions - SOLUTIONS/Unique Characters in String - SOLUTION.ipynb +++ /dev/null @@ -1,122 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Unique Characters in String\n", - "\n", - "## Problem\n", - "Given a string,determine if it is compreised of all unique characters. For example, the string 'abcde' has all unique characters and should return True. The string 'aabcde' contains duplicate characters and should return false." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "We'll show two possible solutions, one using a built-in data structure and a built in function, and another using a built-in data structure but using a look-up method to check if the characters are unique." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def uni_char(s):\n", - " return len(set(s)) == len(s)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def uni_char2(s):\n", - " chars = set()\n", - " for let in s:\n", - " # Check if in set\n", - " if let in chars:\n", - " return False\n", - " else:\n", - " #Add it to the set\n", - " chars.add(let)\n", - " return True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR CODE>\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "\n", - "class TestUnique(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), True)\n", - " assert_equal(sol('goo'), False)\n", - " assert_equal(sol('abcdefg'), True)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run Tests\n", - "t = TestUnique()\n", - "t.test(uni_char)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Anagram Check -checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Anagram Check -checkpoint.ipynb deleted file mode 100644 index fd6f0824..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Anagram Check -checkpoint.ipynb +++ /dev/null @@ -1,197 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Anagram Check\n", - "\n", - "## Problem\n", - "\n", - "Given two strings, check to see if they are anagrams. An anagram is when the two strings can be written using the exact same letters (so you can just rearrange the letters to get a different phrase or word). \n", - "\n", - "For example:\n", - "\n", - " \"public relations\" is an anagram of \"crap built on lies.\"\n", - " \n", - " \"clint eastwood\" is an anagram of \"old west action\"\n", - " \n", - "**Note: Ignore spaces and capitalization. So \"d go\" is an anagram of \"God\" and \"dog\" and \"o d g\".**\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def anagram(s1,s2):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('dog','god')" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('clint eastwood','old west action')" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('aa','bb')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "Run the cell below to test your solution" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class AnagramTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol('go go go','gggooo'),True)\n", - " assert_equal(sol('abc','cba'),True)\n", - " assert_equal(sol('hi man','hi man'),True)\n", - " assert_equal(sol('aabbcc','aabbc'),False)\n", - " assert_equal(sol('123','1 2'),False)\n", - " print \"ALL TEST CASES PASSED\"\n", - "\n", - "# Run Tests\n", - "t = AnagramTest()\n", - "t.test(anagram)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "t.test(anagram2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Array Pair Sum -checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Array Pair Sum -checkpoint.ipynb deleted file mode 100644 index 50ee6bfa..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Array Pair Sum -checkpoint.ipynb +++ /dev/null @@ -1,135 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Array Pair Sum\n", - "\n", - "## Problem\n", - "\n", - "Given an integer array, output all the ** *unique* ** pairs that sum up to a specific value **k**.\n", - "\n", - "So the input:\n", - " \n", - " pair_sum([1,3,2,2],4)\n", - "\n", - "would return **2** pairs:\n", - "\n", - " (1,3)\n", - " (2,2)\n", - "\n", - "**NOTE: FOR TESTING PURPOSES CHANGE YOUR FUNCTION SO IT OUTPUTS THE NUMBER OF PAIRS**\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def pair_sum(arr,k):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pair_sum([1,3,2,2],4)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestPair(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol([1,9,2,8,3,7,4,6,5,5,13,14,11,13,-1],10),6)\n", - " assert_equal(sol([1,2,3,1],3),1)\n", - " assert_equal(sol([1,3,2,2],4),2)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "#Run tests\n", - "t = TestPair()\n", - "t.test(pair_sum)\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Find the Missing Element -checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Find the Missing Element -checkpoint.ipynb deleted file mode 100644 index fe1e12d7..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Find the Missing Element -checkpoint.ipynb +++ /dev/null @@ -1,169 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Find the Missing Element\n", - "\n", - "## Problem\n", - "\n", - "Consider an array of non-negative integers. A second array is formed by shuffling the elements of the first array and deleting a random element. Given these two arrays, find which element is missing in the second array. \n", - "\n", - "Here is an example input, the first array is shuffled and the number 5 is removed to construct the second array.\n", - "\n", - "Input:\n", - " \n", - " finder([1,2,3,4,5,6,7],[3,7,2,1,4,6])\n", - "\n", - "Output:\n", - "\n", - " 5 is the missing number\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def finder(arr1,arr2):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = [1,2,3,4,5,6,7]\n", - "arr2 = [3,7,2,1,4,6]\n", - "finder(arr1,arr2)" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = [5,5,7,7]\n", - "arr2 = [5,7,7]\n", - "\n", - "finder(arr1,arr2)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": false - }, - "source": [ - "_____" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestFinder(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol([5,5,7,7],[5,7,7]),5)\n", - " assert_equal(sol([1,2,3,4,5,6,7],[3,7,2,1,4,6]),5)\n", - " assert_equal(sol([9,8,7,6,5,4,3,2,1],[9,8,7,5,4,3,2,1]),6)\n", - " print 'ALL TEST CASES PASSED'\n", - "\n", - "# Run test\n", - "t = TestFinder()\n", - "t.test(finder)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Largest Continuous Sum -checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Largest Continuous Sum -checkpoint.ipynb deleted file mode 100644 index a4220bb0..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Largest Continuous Sum -checkpoint.ipynb +++ /dev/null @@ -1,125 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Largest Continuous Sum\n", - "\n", - "## Problem\n", - "Given an array of integers (positive and negative) find the largest continuous sum. \n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def large_cont_sum(arr): \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "29" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "large_cont_sum([1,2,-1,3,4,10,10,-10,-1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "Many times in an interview setting the question also requires you to report back the start and end points of the sum. Keep this in mind and see if you can solve that problem, we'll see it in the mock interview section of the course!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "from nose.tools import assert_equal\n", - "\n", - "class LargeContTest(object):\n", - " def test(self,sol):\n", - " assert_equal(sol([1,2,-1,3,4,-1]),9)\n", - " assert_equal(sol([1,2,-1,3,4,10,10,-10,-1]),29)\n", - " assert_equal(sol([-1,1]),1)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "#Run Test\n", - "t = LargeContTest()\n", - "t.test(large_cont_sum)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Sentence Reversal-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Sentence Reversal-checkpoint.ipynb deleted file mode 100644 index e6cf296a..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Sentence Reversal-checkpoint.ipynb +++ /dev/null @@ -1,169 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Sentence Reversal\n", - "\n", - "## Problem\n", - "\n", - "Given a string of words, reverse all the words. For example:\n", - "\n", - "Given:\n", - " \n", - " 'This is the best'\n", - "\n", - "Return:\n", - "\n", - " 'best the is This'\n", - "\n", - "As part of this exercise you should remove all leading and trailing whitespace. So that inputs such as:\n", - "\n", - " ' space here' and 'space here '\n", - "\n", - "both become:\n", - "\n", - " 'here space'\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def rev_word(s):\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'go? to ready you are John, Hi'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word('Hi John, are you ready to go?')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'before space'" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word(' space before')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "_____" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class ReversalTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(' space before'),'before space')\n", - " assert_equal(sol('space after '),'after space')\n", - " assert_equal(sol(' Hello John how are you '),'you are how John Hello')\n", - " assert_equal(sol('1'),'1')\n", - " print \"ALL TEST CASES PASSED\"\n", - " \n", - "# Run and test\n", - "t = ReversalTest()\n", - "t.test(rev_word)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/String Compression -checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/String Compression -checkpoint.ipynb deleted file mode 100644 index e8c7d5f4..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/String Compression -checkpoint.ipynb +++ /dev/null @@ -1,128 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# String Compression\n", - "\n", - "## Problem\n", - "\n", - "Given a string in the form 'AAAABBBBCCCCCDDEEEE' compress it to become 'A4B4C5D2E4'. For this problem, you can falsely \"compress\" strings of single or double letters. For instance, it is okay for 'AAB' to return 'A2B1' even though this technically takes more space. \n", - "\n", - "The function should also be case sensitive, so that a string 'AAAaaa' returns 'A3a3'." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def compress(s):\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'A5B4C4'" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compress('AAAAABBBBCCCC')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestCompress(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), '')\n", - " assert_equal(sol('AABBCC'), 'A2B2C2')\n", - " assert_equal(sol('AAABCCDDDDD'), 'A3B1C2D5')\n", - " print 'ALL TEST CASES PASSED'\n", - "\n", - "# Run Tests\n", - "t = TestCompress()\n", - "t.test(compress)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Unique Characters in String-checkpoint.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Unique Characters in String-checkpoint.ipynb deleted file mode 100644 index 9659d2bf..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/.ipynb_checkpoints/Unique Characters in String-checkpoint.ipynb +++ /dev/null @@ -1,104 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Unique Characters in String\n", - "\n", - "## Problem\n", - "Given a string,determine if it is compreised of all unique characters. For example, the string 'abcde' has all unique characters and should return True. The string 'aabcde' contains duplicate characters and should return false." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def uni_char(s):\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR CODE>\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "\n", - "class TestUnique(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), True)\n", - " assert_equal(sol('goo'), False)\n", - " assert_equal(sol('abcdefg'), True)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run Tests\n", - "t = TestUnique()\n", - "t.test(uni_char)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Anagram Check .ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Anagram Check .ipynb deleted file mode 100644 index fd6f0824..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Anagram Check .ipynb +++ /dev/null @@ -1,197 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Anagram Check\n", - "\n", - "## Problem\n", - "\n", - "Given two strings, check to see if they are anagrams. An anagram is when the two strings can be written using the exact same letters (so you can just rearrange the letters to get a different phrase or word). \n", - "\n", - "For example:\n", - "\n", - " \"public relations\" is an anagram of \"crap built on lies.\"\n", - " \n", - " \"clint eastwood\" is an anagram of \"old west action\"\n", - " \n", - "**Note: Ignore spaces and capitalization. So \"d go\" is an anagram of \"God\" and \"dog\" and \"o d g\".**\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def anagram(s1,s2):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('dog','god')" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('clint eastwood','old west action')" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "anagram('aa','bb')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "Run the cell below to test your solution" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class AnagramTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol('go go go','gggooo'),True)\n", - " assert_equal(sol('abc','cba'),True)\n", - " assert_equal(sol('hi man','hi man'),True)\n", - " assert_equal(sol('aabbcc','aabbc'),False)\n", - " assert_equal(sol('123','1 2'),False)\n", - " print \"ALL TEST CASES PASSED\"\n", - "\n", - "# Run Tests\n", - "t = AnagramTest()\n", - "t.test(anagram)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "t.test(anagram2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Array Pair Sum .ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Array Pair Sum .ipynb deleted file mode 100644 index 50ee6bfa..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Array Pair Sum .ipynb +++ /dev/null @@ -1,135 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Array Pair Sum\n", - "\n", - "## Problem\n", - "\n", - "Given an integer array, output all the ** *unique* ** pairs that sum up to a specific value **k**.\n", - "\n", - "So the input:\n", - " \n", - " pair_sum([1,3,2,2],4)\n", - "\n", - "would return **2** pairs:\n", - "\n", - " (1,3)\n", - " (2,2)\n", - "\n", - "**NOTE: FOR TESTING PURPOSES CHANGE YOUR FUNCTION SO IT OUTPUTS THE NUMBER OF PAIRS**\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def pair_sum(arr,k):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pair_sum([1,3,2,2],4)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestPair(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol([1,9,2,8,3,7,4,6,5,5,13,14,11,13,-1],10),6)\n", - " assert_equal(sol([1,2,3,1],3),1)\n", - " assert_equal(sol([1,3,2,2],4),2)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "#Run tests\n", - "t = TestPair()\n", - "t.test(pair_sum)\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Find the Missing Element .ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Find the Missing Element .ipynb deleted file mode 100644 index fe1e12d7..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Find the Missing Element .ipynb +++ /dev/null @@ -1,169 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Find the Missing Element\n", - "\n", - "## Problem\n", - "\n", - "Consider an array of non-negative integers. A second array is formed by shuffling the elements of the first array and deleting a random element. Given these two arrays, find which element is missing in the second array. \n", - "\n", - "Here is an example input, the first array is shuffled and the number 5 is removed to construct the second array.\n", - "\n", - "Input:\n", - " \n", - " finder([1,2,3,4,5,6,7],[3,7,2,1,4,6])\n", - "\n", - "Output:\n", - "\n", - " 5 is the missing number\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def finder(arr1,arr2):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = [1,2,3,4,5,6,7]\n", - "arr2 = [3,7,2,1,4,6]\n", - "finder(arr1,arr2)" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr1 = [5,5,7,7]\n", - "arr2 = [5,7,7]\n", - "\n", - "finder(arr1,arr2)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": false - }, - "source": [ - "_____" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestFinder(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol([5,5,7,7],[5,7,7]),5)\n", - " assert_equal(sol([1,2,3,4,5,6,7],[3,7,2,1,4,6]),5)\n", - " assert_equal(sol([9,8,7,6,5,4,3,2,1],[9,8,7,5,4,3,2,1]),6)\n", - " print 'ALL TEST CASES PASSED'\n", - "\n", - "# Run test\n", - "t = TestFinder()\n", - "t.test(finder)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Largest Continuous Sum .ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Largest Continuous Sum .ipynb deleted file mode 100644 index a4220bb0..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Largest Continuous Sum .ipynb +++ /dev/null @@ -1,125 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Largest Continuous Sum\n", - "\n", - "## Problem\n", - "Given an array of integers (positive and negative) find the largest continuous sum. \n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def large_cont_sum(arr): \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "29" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "large_cont_sum([1,2,-1,3,4,10,10,-10,-1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "Many times in an interview setting the question also requires you to report back the start and end points of the sum. Keep this in mind and see if you can solve that problem, we'll see it in the mock interview section of the course!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "from nose.tools import assert_equal\n", - "\n", - "class LargeContTest(object):\n", - " def test(self,sol):\n", - " assert_equal(sol([1,2,-1,3,4,-1]),9)\n", - " assert_equal(sol([1,2,-1,3,4,10,10,-10,-1]),29)\n", - " assert_equal(sol([-1,1]),1)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "#Run Test\n", - "t = LargeContTest()\n", - "t.test(large_cont_sum)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Sentence Reversal.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Sentence Reversal.ipynb deleted file mode 100644 index e6cf296a..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Sentence Reversal.ipynb +++ /dev/null @@ -1,169 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Sentence Reversal\n", - "\n", - "## Problem\n", - "\n", - "Given a string of words, reverse all the words. For example:\n", - "\n", - "Given:\n", - " \n", - " 'This is the best'\n", - "\n", - "Return:\n", - "\n", - " 'best the is This'\n", - "\n", - "As part of this exercise you should remove all leading and trailing whitespace. So that inputs such as:\n", - "\n", - " ' space here' and 'space here '\n", - "\n", - "both become:\n", - "\n", - " 'here space'\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def rev_word(s):\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'go? to ready you are John, Hi'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word('Hi John, are you ready to go?')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'before space'" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rev_word(' space before')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "_____" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "class ReversalTest(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(' space before'),'before space')\n", - " assert_equal(sol('space after '),'after space')\n", - " assert_equal(sol(' Hello John how are you '),'you are how John Hello')\n", - " assert_equal(sol('1'),'1')\n", - " print \"ALL TEST CASES PASSED\"\n", - " \n", - "# Run and test\n", - "t = ReversalTest()\n", - "t.test(rev_word)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/String Compression .ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/String Compression .ipynb deleted file mode 100644 index e8c7d5f4..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/String Compression .ipynb +++ /dev/null @@ -1,128 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# String Compression\n", - "\n", - "## Problem\n", - "\n", - "Given a string in the form 'AAAABBBBCCCCCDDEEEE' compress it to become 'A4B4C5D2E4'. For this problem, you can falsely \"compress\" strings of single or double letters. For instance, it is okay for 'AAB' to return 'A2B1' even though this technically takes more space. \n", - "\n", - "The function should also be case sensitive, so that a string 'AAAaaa' returns 'A3a3'." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def compress(s):\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'A5B4C4'" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compress('AAAAABBBBCCCC')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestCompress(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), '')\n", - " assert_equal(sol('AABBCC'), 'A2B2C2')\n", - " assert_equal(sol('AAABCCDDDDD'), 'A3B1C2D5')\n", - " print 'ALL TEST CASES PASSED'\n", - "\n", - "# Run Tests\n", - "t = TestCompress()\n", - "t.test(compress)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Unique Characters in String.ipynb b/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Unique Characters in String.ipynb deleted file mode 100644 index 9659d2bf..00000000 --- a/Array Sequences/Array Sequences Interview Questions/Array Sequence Interview Questions/Unique Characters in String.ipynb +++ /dev/null @@ -1,104 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Unique Characters in String\n", - "\n", - "## Problem\n", - "Given a string,determine if it is compreised of all unique characters. For example, the string 'abcde' has all unique characters and should return True. The string 'aabcde' contains duplicate characters and should return false." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def uni_char(s):\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR CODE>\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "\n", - "class TestUnique(object):\n", - "\n", - " def test(self, sol):\n", - " assert_equal(sol(''), True)\n", - " assert_equal(sol('goo'), False)\n", - " assert_equal(sol('abcdefg'), True)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run Tests\n", - "t = TestUnique()\n", - "t.test(uni_char)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Array Sequences/Dynamic Array Exercise.ipynb b/Array Sequences/Dynamic Array Exercise.ipynb deleted file mode 100644 index 2b484bd7..00000000 --- a/Array Sequences/Dynamic Array Exercise.ipynb +++ /dev/null @@ -1,309 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Dynamic Array Exercise\n", - "____\n", - "\n", - "In this exercise we will create our own Dynamic Array class!\n", - "\n", - "We'll be using a built in library called [ctypes](https://docs.python.org/2/library/ctypes.html). Check out the documentation for more info, but its basically going to be used here as a raw array from the ctypes module.\n", - "If you find yourself very interested in it, check out: [Ctypes Tutorial](http://starship.python.net/crew/theller/ctypes/tutorial.html)\n", - "\n", - "Also..." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**A quick note on public vs private methods, we can use an underscore _ before the method name to keep it non-public. For example:**" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class M(object):\n", - " \n", - " def public(self):\n", - " print 'Use Tab to see me!'\n", - " \n", - " def _private(self):\n", - " print \"You won't be able to Tab to see me!\"" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "m = M()" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Use Tab to see me!\n" - ] - } - ], - "source": [ - "m.public()" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You won't be able to see me!\n" - ] - } - ], - "source": [ - "m._private()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Check out PEP 8 and the Python docs for more info on this!\n", - "_____\n", - "\n", - "### Dynamic Array Implementation" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "import ctypes\n", - "\n", - "class DynamicArray(object):\n", - " '''\n", - " DYNAMIC ARRAY CLASS (Similar to Python List)\n", - " '''\n", - " \n", - " def __init__(self):\n", - " self.n = 0 # Count actual elements (Default is 0)\n", - " self.capacity = 1 # Default Capacity\n", - " self.A = self.make_array(self.capacity)\n", - " \n", - " def __len__(self):\n", - " \"\"\"\n", - " Return number of elements sorted in array\n", - " \"\"\"\n", - " return self.n\n", - " \n", - " def __getitem__(self,k):\n", - " \"\"\"\n", - " Return element at index k\n", - " \"\"\"\n", - " if not 0 <= k 0 and fast:\n", - " fast=fast.nextnode\n", - " n-=1\n", - " if not fast:\n", - " return head\n", - " while fast:\n", - " fast=fast.nextnode\n", - " slow=slow.nextnode\n", - " return slow\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION AGAINST A TEST CASE \n", - "\n", - "PLEASE NOTE THIS IS JUST ONE CASE\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "e = Node(5)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d\n", - "d.nextnode = e\n", - "\n", - "####\n", - "\n", - "class TestNLast(object):\n", - " \n", - " def test(self,sol):\n", - " \n", - " assert_equal(sol(2,a),d)\n", - " print ('ALL TEST CASES PASSED')\n", - " \n", - "# Run tests\n", - "t = TestNLast()\n", - "t.test(nth_to_last_node)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/.ipynb_checkpoints/Linked List Reversal -checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/.ipynb_checkpoints/Linked List Reversal -checkpoint.ipynb deleted file mode 100644 index d6d333eb..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/.ipynb_checkpoints/Linked List Reversal -checkpoint.ipynb +++ /dev/null @@ -1,244 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Linked List Reversal \n", - "\n", - "## Problem\n", - "\n", - "Write a function to reverse a Linked List in place. The function will take in the head of the list as input and return the new head of the list.\n", - "\n", - "You are given the example Linked List Node class:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def reverse(head):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "**Note, this isn't a classic run cell for testing your solution, please read the statements below carefully**\n", - "\n", - "You should be able to easily test your own solution to make sure it works. Given the short list a,b,c,d with values 1,2,3,4. Check the effect of your reverse function and make sure the results match the logic here below:" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create a list of 4 nodes\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "\n", - "# Set up order a,b,c,d with values 1,2,3,4\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's check the values of the nodes coming after a, b and c:" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n", - "3\n", - "4\n" - ] - } - ], - "source": [ - "print a.nextnode.value\n", - "print b.nextnode.value\n", - "print c.nextnode.value" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'value'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" - ] - } - ], - "source": [ - "d.nextnode.value" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So far so good. Note how there is no value proceeding the last node, this makes sense! Now let's reverse the linked list, we should see the opposite order of values!" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "<__main__.Node at 0x104bd7dd0>" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "reverse(a)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n", - "2\n", - "1\n" - ] - } - ], - "source": [ - "print d.nextnode.value\n", - "print c.nextnode.value\n", - "print b.nextnode.value" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'value'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m \u001b[0;31m# This will give an error since it now points to None\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" - ] - } - ], - "source": [ - "print a.nextnode.value # This will give an error since it now points to None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great, now we can see that each of the values points to its previous value (although now that the linked list is reversed we can see the ordering has also reversed)\n", - "\n", - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/.ipynb_checkpoints/Singly Linked List Cycle Check-checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/.ipynb_checkpoints/Singly Linked List Cycle Check-checkpoint.ipynb deleted file mode 100644 index 157dd789..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/.ipynb_checkpoints/Singly Linked List Cycle Check-checkpoint.ipynb +++ /dev/null @@ -1,149 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Singly Linked List Cycle Check \n", - "\n", - "## Problem\n", - "\n", - "Given a singly linked list, write a function which takes in the first node in a singly linked list and returns a boolean indicating if the linked list contains a \"cycle\".\n", - "\n", - "A cycle is when a node's next point actually points back to a previous node in the list. This is also sometimes known as a circularly linked list.\n", - "\n", - "You've been given the Linked List Node class code:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "Fill out your solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def cycle_check(node):\n", - "# Use fast and slow pointer\n", - " fast, slow = node, node\n", - " while fast and fast.nextnode:\n", - " fast = fast.nextnode\n", - " if fast == slow:\n", - " return True\n", - " fast = fast.nextnode\n", - " slow = slow.nextnode\n", - " return False\n", - " pass #Your function should return a boolean" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "# CREATE CYCLE LIST\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = a # Cycle Here!\n", - "\n", - "\n", - "# CREATE NON CYCLE LIST\n", - "x = Node(1)\n", - "y = Node(2)\n", - "z = Node(3)\n", - "\n", - "x.nextnode = y\n", - "y.nextnode = z\n", - "\n", - "\n", - "#############\n", - "class TestCycleCheck(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(a),True)\n", - " assert_equal(sol(x),False)\n", - " \n", - " print (\"ALL TEST CASES PASSED\")\n", - " \n", - "# Run Tests\n", - "\n", - "t = TestCycleCheck()\n", - "t.test(cycle_check)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Implement a Doubly Linked List.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Implement a Doubly Linked List.ipynb deleted file mode 100644 index 789493fe..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Implement a Doubly Linked List.ipynb +++ /dev/null @@ -1,69 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Doubly Linked List\n", - "\n", - "For this interview problem, implement a node class and show how it can be used to create a doubly linked list." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "class Node(object):\n", - " def __init__(self, value):\n", - " self.prev = None\n", - " self.val = value\n", - " self.next = None\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create a Doubly Linked List here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "Note that there is no test for this solution (because it would give away the answer structure).\n", - "\n", - "Check out the Implement a Linked List Solution Notebook for the answer to this interview problem, as well as the answer for the implementation of a singly linked list." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Implement a Singly Linked List.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Implement a Singly Linked List.ipynb deleted file mode 100644 index 340116ee..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Implement a Singly Linked List.ipynb +++ /dev/null @@ -1,69 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Singly Linked List\n", - "\n", - "For this interview problem, create a node class and show how it can be used to create a Singly Linked List" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "class Node(object):\n", - " def __init__(self, value):\n", - " self.val = value\n", - " self.next = None\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create a Singly Linked List here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "Note that there is no test for this solution (because it would give away the answer structure).\n", - "\n", - "Check out the Implement a Linked List Solution Notebook for the answer to this interview problem, as well as the answer for the implementation of a doubly linked list." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Linked List Nth to Last Node .ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Linked List Nth to Last Node .ipynb deleted file mode 100644 index 83d1468a..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Linked List Nth to Last Node .ipynb +++ /dev/null @@ -1,192 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Linked List Nth to Last Node \n", - "\n", - "## Problem Statement\n", - "Write a function that takes a head node and an integer value **n** and then returns the nth to last node in the linked list. For example, given:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "class Node:\n", - "\n", - " def __init__(self, value):\n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Example Input and Output:**" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "e = Node(5)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d\n", - "d.nextnode = e\n", - "\n", - "# This would return the node d with a value of 4, because its the 2nd to last node.\n", - "target_node = nth_to_last_node(2, a) " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "4" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "target_node.value" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def nth_to_last_node(n, head):\n", - " slow, fast = head, head\n", - " while n > 0 and fast:\n", - " fast=fast.nextnode\n", - " n-=1\n", - " if not fast:\n", - " return head\n", - " while fast:\n", - " fast=fast.nextnode\n", - " slow=slow.nextnode\n", - " return slow\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION AGAINST A TEST CASE \n", - "\n", - "PLEASE NOTE THIS IS JUST ONE CASE\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "e = Node(5)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d\n", - "d.nextnode = e\n", - "\n", - "####\n", - "\n", - "class TestNLast(object):\n", - " \n", - " def test(self,sol):\n", - " \n", - " assert_equal(sol(2,a),d)\n", - " print ('ALL TEST CASES PASSED')\n", - " \n", - "# Run tests\n", - "t = TestNLast()\n", - "t.test(nth_to_last_node)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Linked List Reversal .ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Linked List Reversal .ipynb deleted file mode 100644 index 129617e9..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Linked List Reversal .ipynb +++ /dev/null @@ -1,246 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Linked List Reversal \n", - "\n", - "## Problem\n", - "\n", - "Write a function to reverse a Linked List in place. The function will take in the head of the list as input and return the new head of the list.\n", - "\n", - "You are given the example Linked List Node class:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "def reverse(head):\n", - " cur = head\n", - " pre, nxt = None, None\n", - " while cur:# watch out\n", - " nxt = cur.nextnode\n", - " cur.nextnode = pre\n", - " pre = cur\n", - " cur = nxt\n", - " return pre #watch out\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "**Note, this isn't a classic run cell for testing your solution, please read the statements below carefully**\n", - "\n", - "You should be able to easily test your own solution to make sure it works. Given the short list a,b,c,d with values 1,2,3,4. Check the effect of your reverse function and make sure the results match the logic here below:" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "# Create a list of 4 nodes\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "\n", - "# Set up order a,b,c,d with values 1,2,3,4\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's check the values of the nodes coming after a, b and c:" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n", - "3\n", - "4\n" - ] - } - ], - "source": [ - "print (a.nextnode.value)\n", - "print (b.nextnode.value)\n", - "print (c.nextnode.value)" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'value'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" - ] - } - ], - "source": [ - "d.nextnode.value" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So far so good. Note how there is no value proceeding the last node, this makes sense! Now let's reverse the linked list, we should see the opposite order of values!" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<__main__.Node at 0x1067a2f28>" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "reverse(a)" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n", - "2\n", - "1\n" - ] - } - ], - "source": [ - "print (d.nextnode.value)\n", - "print (c.nextnode.value)\n", - "print (b.nextnode.value)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "Missing parentheses in call to 'print' (, line 1)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m print a.nextnode.value # This will give an error since it now points to None\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m Missing parentheses in call to 'print'\n" - ] - } - ], - "source": [ - "print a.nextnode.value # This will give an error since it now points to None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great, now we can see that each of the values points to its previous value (although now that the linked list is reversed we can see the ordering has also reversed)\n", - "\n", - "## Good Job!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Singly Linked List Cycle Check.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Singly Linked List Cycle Check.ipynb deleted file mode 100644 index 157dd789..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - PRACTICE/Singly Linked List Cycle Check.ipynb +++ /dev/null @@ -1,149 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Singly Linked List Cycle Check \n", - "\n", - "## Problem\n", - "\n", - "Given a singly linked list, write a function which takes in the first node in a singly linked list and returns a boolean indicating if the linked list contains a \"cycle\".\n", - "\n", - "A cycle is when a node's next point actually points back to a previous node in the list. This is also sometimes known as a circularly linked list.\n", - "\n", - "You've been given the Linked List Node class code:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "Fill out your solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def cycle_check(node):\n", - "# Use fast and slow pointer\n", - " fast, slow = node, node\n", - " while fast and fast.nextnode:\n", - " fast = fast.nextnode\n", - " if fast == slow:\n", - " return True\n", - " fast = fast.nextnode\n", - " slow = slow.nextnode\n", - " return False\n", - " pass #Your function should return a boolean" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "# CREATE CYCLE LIST\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = a # Cycle Here!\n", - "\n", - "\n", - "# CREATE NON CYCLE LIST\n", - "x = Node(1)\n", - "y = Node(2)\n", - "z = Node(3)\n", - "\n", - "x.nextnode = y\n", - "y.nextnode = z\n", - "\n", - "\n", - "#############\n", - "class TestCycleCheck(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(a),True)\n", - " assert_equal(sol(x),False)\n", - " \n", - " print (\"ALL TEST CASES PASSED\")\n", - " \n", - "# Run Tests\n", - "\n", - "t = TestCycleCheck()\n", - "t.test(cycle_check)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Implement a Linked List -SOLUTION-checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Implement a Linked List -SOLUTION-checkpoint.ipynb deleted file mode 100644 index 303ba52f..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Implement a Linked List -SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,158 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Linked List - SOLUTION\n", - "\n", - "## Problem Statement\n", - "\n", - "Implement a Linked List by using a Node class object. Show how you would implement a Singly Linked List *and* a Doubly Linked List!\n", - "\n", - "## Solution\n", - "\n", - "Since this is asking the same thing as the implementation lectures, please refer to those video lectures and notes for a full explanation. The code from those lectures is displayed below:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Singly Linked List" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class LinkedListNode(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "a = LinkedListNode(1)\n", - "b = LinkedListNode(2)\n", - "c = LinkedListNode(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "a.nextnode = b\n", - "b.nextnode = c" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Doubly Linked List" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class DoublyLinkedListNode(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.next_node = None\n", - " self.prev_node = None" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "a = DoublyLinkedListNode(1)\n", - "b = DoublyLinkedListNode(2)\n", - "c = DoublyLinkedListNode(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Setting b after a\n", - "b.prev_node = a\n", - "a.next_node = b" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Setting c after a\n", - "b.next_node = c\n", - "c.prev_node = b" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Linked List Nth to Last Node - SOLUTION-checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Linked List Nth to Last Node - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 457e6e48..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Linked List Nth to Last Node - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,210 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Linked List Nth to Last Node - SOLUTION\n", - "\n", - "## Problem Statement\n", - "Write a function that takes a head node and an integer value **n** and then returns the nth to last node in the linked list. For example, given:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node:\n", - "\n", - " def __init__(self, value):\n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "e = Node(5)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d\n", - "d.nextnode = e\n", - "\n", - "# This would return the node d with a value of 4, because its the 2nd to last node.\n", - "target_node = nth_to_last_node(2, a) " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "4" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "target_node.value" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "One approach to this problem is this:\n", - "\n", - "Imagine you have a bunch of nodes and a \"block\" which is n-nodes wide. We could walk this \"block\" all the way down the list, and once the front of the block reached the end, then the other end of the block would be a the Nth node! \n", - "\n", - "So to implement this \"block\" we would just have two pointers a left and right pair of pointers. Let's mark out the steps we will need to take:\n", - "\n", - "* Walk one pointer **n** nodes from the head, this will be the right_point\n", - "* Put the other pointer at the head, this will be the left_point\n", - "* Walk/traverse the block (both pointers) towards the tail, one node at a time, keeping a distance **n** between them.\n", - "* Once the right_point has hit the tail, we know that the left point is at the target.\n", - "\n", - "Let's see the code for this!" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def nth_to_last_node(n, head):\n", - "\n", - " left_pointer = head\n", - " right_pointer = head\n", - "\n", - " # Set right pointer at n nodes away from head\n", - " for i in xrange(n-1):\n", - " \n", - " # Check for edge case of not having enough nodes!\n", - " if not right_pointer.nextnode:\n", - " raise LookupError('Error: n is larger than the linked list.')\n", - "\n", - " # Otherwise, we can set the block\n", - " right_pointer = right_pointer.nextnode\n", - "\n", - " # Move the block down the linked list\n", - " while right_pointer.nextnode:\n", - " left_pointer = left_pointer.nextnode\n", - " right_pointer = right_pointer.nextnode\n", - "\n", - " # Now return left pointer, its at the nth to last element!\n", - " return left_pointer" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION AGAINST A TEST CASE \n", - "\n", - "PLEASE NOTE THIS IS JUST ONE CASE\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "e = Node(5)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d\n", - "d.nextnode = e\n", - "\n", - "####\n", - "\n", - "class TestNLast(object):\n", - " \n", - " def test(self,sol):\n", - " \n", - " assert_equal(sol(2,a),d)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run tests\n", - "t = TestNLast()\n", - "t.test(nth_to_last_node)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Linked List Reversal - SOLUTION-checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Linked List Reversal - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 5ac84405..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Linked List Reversal - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,267 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Linked List Reversal - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "Write a function to reverse a Linked List in place. The function will take in the head of the list as input and return the new head of the list.\n", - "\n", - "You are given the example Linked List Node class:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Solution\n", - "\n", - "Since we want to do this in place we want to make the funciton operate in O(1) space, meaning we don't want to create a new list, so we will simply use the current nodes! Time wise, we can perform the reversal in O(n) time.\n", - "\n", - "We can reverse the list by changing the next pointer of each node. Each node's next pointer should point to the previous node.\n", - "\n", - "In one pass from head to tail of our input list, we will point each node's next pointer to the previous element.\n", - "\n", - "Make sure to copy current.next_node into next_node **before** setting current.next_node to previous. Let's see this solution coded out:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def reverse(head):\n", - " \n", - " # Set up current,previous, and next nodes\n", - " current = head\n", - " previous = None\n", - " nextnode = None\n", - "\n", - " # until we have gone through to the end of the list\n", - " while current:\n", - " \n", - " # Make sure to copy the current nodes next node to a variable next_node\n", - " # Before overwriting as the previous node for reversal\n", - " nextnode = current.nextnode\n", - "\n", - " # Reverse the pointer ot the next_node\n", - " current.nextnode = previous\n", - "\n", - " # Go one forward in the list\n", - " previous = current\n", - " current = nextnode\n", - "\n", - " return previous" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "You should be able to easily test your own solution to make sure it works. Given the short list a,b,c,d with values 1,2,3,4. Check the effect of your reverse function and maek sure the results match the logic here below:" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create a list of 4 nodes\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "\n", - "# Set up order a,b,c,d with values 1,2,3,4\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's check the values of the nodes coming after a, b and c:" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n", - "3\n", - "4\n" - ] - } - ], - "source": [ - "print a.nextnode.value\n", - "print b.nextnode.value\n", - "print c.nextnode.value" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'value'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" - ] - } - ], - "source": [ - "d.nextnode.value" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So far so good. Note how there is no value proceeding the last node, this makes sense! Now let's reverse the linked list, we should see the opposite order of values!" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "<__main__.Node at 0x104bd7dd0>" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "reverse(a)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n", - "2\n", - "1\n" - ] - } - ], - "source": [ - "print d.nextnode.value\n", - "print c.nextnode.value\n", - "print b.nextnode.value" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'value'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m \u001b[0;31m# This will give an error since it now points to None\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" - ] - } - ], - "source": [ - "print a.nextnode.value # This will give an error since it now points to None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great, now we can see that each of the values points to its previous value (although now that the linked list is reversed we can see the ordering has also reversed)\n", - "\n", - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Singly Linked List Cycle Check - SOLUTION-checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Singly Linked List Cycle Check - SOLUTION-checkpoint.ipynb deleted file mode 100644 index f0752ac6..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/.ipynb_checkpoints/Singly Linked List Cycle Check - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,169 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Singly Linked List Cycle Check - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "Given a singly linked list, write a function which takes in the first node in a singly linked list and returns a boolean indicating if the linked list contains a \"cycle\".\n", - "\n", - "A cycle is when a node's next point actually points back to a previous node in the list. This is also sometimes known as a circularly linked list.\n", - "\n", - "You've been given the Linked List Node class code:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "To solve this problem we will have two markers traversing through the list. **marker1** and **marker2**. We will have both makers begin at the first node of the list and traverse through the linked list. However the second marker, marker2, will move two nodes ahead for every one node that marker1 moves.\n", - "\n", - "By this logic we can imagine that the markers are \"racing\" through the linked list, with marker2 moving faster. If the linked list has a cylce and is circularly connected we will have the analogy of a track, in this case the marker2 will eventually be \"lapping\" the marker1 and they will equal each other. \n", - "\n", - "If the linked list has no cycle, then marker2 should be able to continue on until the very end, never equaling the first marker.\n", - "\n", - "Let's see this logic coded out:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def cycle_check(node):\n", - "\n", - " # Begin both markers at the first node\n", - " marker1 = node\n", - " marker2 = node\n", - "\n", - " # Go until end of list\n", - " while marker2 != None and marker2.nextnode != None:\n", - " \n", - " # Note\n", - " marker1 = marker1.nextnode\n", - " marker2 = marker2.nextnode.nextnode\n", - "\n", - " # Check if the markers have matched\n", - " if marker2 == marker1:\n", - " return True\n", - "\n", - " # Case where marker ahead reaches the end of the list\n", - " return False" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "# CREATE CYCLE LIST\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = a # Cycle Here!\n", - "\n", - "\n", - "# CREATE NON CYCLE LIST\n", - "x = Node(1)\n", - "y = Node(2)\n", - "z = Node(3)\n", - "\n", - "x.nextnode = y\n", - "y.nextnode = z\n", - "\n", - "\n", - "#############\n", - "class TestCycleCheck(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(a),True)\n", - " assert_equal(sol(x),False)\n", - " \n", - " print \"ALL TEST CASES PASSED\"\n", - " \n", - "# Run Tests\n", - "\n", - "t = TestCycleCheck()\n", - "t.test(cycle_check)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Implement a Linked List -SOLUTION.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Implement a Linked List -SOLUTION.ipynb deleted file mode 100644 index 303ba52f..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Implement a Linked List -SOLUTION.ipynb +++ /dev/null @@ -1,158 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Linked List - SOLUTION\n", - "\n", - "## Problem Statement\n", - "\n", - "Implement a Linked List by using a Node class object. Show how you would implement a Singly Linked List *and* a Doubly Linked List!\n", - "\n", - "## Solution\n", - "\n", - "Since this is asking the same thing as the implementation lectures, please refer to those video lectures and notes for a full explanation. The code from those lectures is displayed below:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Singly Linked List" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class LinkedListNode(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "a = LinkedListNode(1)\n", - "b = LinkedListNode(2)\n", - "c = LinkedListNode(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "a.nextnode = b\n", - "b.nextnode = c" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Doubly Linked List" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class DoublyLinkedListNode(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.next_node = None\n", - " self.prev_node = None" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "a = DoublyLinkedListNode(1)\n", - "b = DoublyLinkedListNode(2)\n", - "c = DoublyLinkedListNode(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Setting b after a\n", - "b.prev_node = a\n", - "a.next_node = b" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Setting c after a\n", - "b.next_node = c\n", - "c.prev_node = b" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Linked List Nth to Last Node - SOLUTION.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Linked List Nth to Last Node - SOLUTION.ipynb deleted file mode 100644 index 457e6e48..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Linked List Nth to Last Node - SOLUTION.ipynb +++ /dev/null @@ -1,210 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Linked List Nth to Last Node - SOLUTION\n", - "\n", - "## Problem Statement\n", - "Write a function that takes a head node and an integer value **n** and then returns the nth to last node in the linked list. For example, given:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node:\n", - "\n", - " def __init__(self, value):\n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "e = Node(5)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d\n", - "d.nextnode = e\n", - "\n", - "# This would return the node d with a value of 4, because its the 2nd to last node.\n", - "target_node = nth_to_last_node(2, a) " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "4" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "target_node.value" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "One approach to this problem is this:\n", - "\n", - "Imagine you have a bunch of nodes and a \"block\" which is n-nodes wide. We could walk this \"block\" all the way down the list, and once the front of the block reached the end, then the other end of the block would be a the Nth node! \n", - "\n", - "So to implement this \"block\" we would just have two pointers a left and right pair of pointers. Let's mark out the steps we will need to take:\n", - "\n", - "* Walk one pointer **n** nodes from the head, this will be the right_point\n", - "* Put the other pointer at the head, this will be the left_point\n", - "* Walk/traverse the block (both pointers) towards the tail, one node at a time, keeping a distance **n** between them.\n", - "* Once the right_point has hit the tail, we know that the left point is at the target.\n", - "\n", - "Let's see the code for this!" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def nth_to_last_node(n, head):\n", - "\n", - " left_pointer = head\n", - " right_pointer = head\n", - "\n", - " # Set right pointer at n nodes away from head\n", - " for i in xrange(n-1):\n", - " \n", - " # Check for edge case of not having enough nodes!\n", - " if not right_pointer.nextnode:\n", - " raise LookupError('Error: n is larger than the linked list.')\n", - "\n", - " # Otherwise, we can set the block\n", - " right_pointer = right_pointer.nextnode\n", - "\n", - " # Move the block down the linked list\n", - " while right_pointer.nextnode:\n", - " left_pointer = left_pointer.nextnode\n", - " right_pointer = right_pointer.nextnode\n", - "\n", - " # Now return left pointer, its at the nth to last element!\n", - " return left_pointer" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION AGAINST A TEST CASE \n", - "\n", - "PLEASE NOTE THIS IS JUST ONE CASE\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "e = Node(5)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d\n", - "d.nextnode = e\n", - "\n", - "####\n", - "\n", - "class TestNLast(object):\n", - " \n", - " def test(self,sol):\n", - " \n", - " assert_equal(sol(2,a),d)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run tests\n", - "t = TestNLast()\n", - "t.test(nth_to_last_node)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Linked List Reversal - SOLUTION.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Linked List Reversal - SOLUTION.ipynb deleted file mode 100644 index 5ac84405..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Linked List Reversal - SOLUTION.ipynb +++ /dev/null @@ -1,267 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Linked List Reversal - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "Write a function to reverse a Linked List in place. The function will take in the head of the list as input and return the new head of the list.\n", - "\n", - "You are given the example Linked List Node class:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Solution\n", - "\n", - "Since we want to do this in place we want to make the funciton operate in O(1) space, meaning we don't want to create a new list, so we will simply use the current nodes! Time wise, we can perform the reversal in O(n) time.\n", - "\n", - "We can reverse the list by changing the next pointer of each node. Each node's next pointer should point to the previous node.\n", - "\n", - "In one pass from head to tail of our input list, we will point each node's next pointer to the previous element.\n", - "\n", - "Make sure to copy current.next_node into next_node **before** setting current.next_node to previous. Let's see this solution coded out:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def reverse(head):\n", - " \n", - " # Set up current,previous, and next nodes\n", - " current = head\n", - " previous = None\n", - " nextnode = None\n", - "\n", - " # until we have gone through to the end of the list\n", - " while current:\n", - " \n", - " # Make sure to copy the current nodes next node to a variable next_node\n", - " # Before overwriting as the previous node for reversal\n", - " nextnode = current.nextnode\n", - "\n", - " # Reverse the pointer ot the next_node\n", - " current.nextnode = previous\n", - "\n", - " # Go one forward in the list\n", - " previous = current\n", - " current = nextnode\n", - "\n", - " return previous" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "You should be able to easily test your own solution to make sure it works. Given the short list a,b,c,d with values 1,2,3,4. Check the effect of your reverse function and maek sure the results match the logic here below:" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create a list of 4 nodes\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "\n", - "# Set up order a,b,c,d with values 1,2,3,4\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's check the values of the nodes coming after a, b and c:" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n", - "3\n", - "4\n" - ] - } - ], - "source": [ - "print a.nextnode.value\n", - "print b.nextnode.value\n", - "print c.nextnode.value" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'value'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" - ] - } - ], - "source": [ - "d.nextnode.value" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So far so good. Note how there is no value proceeding the last node, this makes sense! Now let's reverse the linked list, we should see the opposite order of values!" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "<__main__.Node at 0x104bd7dd0>" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "reverse(a)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n", - "2\n", - "1\n" - ] - } - ], - "source": [ - "print d.nextnode.value\n", - "print c.nextnode.value\n", - "print b.nextnode.value" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'value'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m \u001b[0;31m# This will give an error since it now points to None\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" - ] - } - ], - "source": [ - "print a.nextnode.value # This will give an error since it now points to None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great, now we can see that each of the values points to its previous value (although now that the linked list is reversed we can see the ordering has also reversed)\n", - "\n", - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Singly Linked List Cycle Check - SOLUTION.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Singly Linked List Cycle Check - SOLUTION.ipynb deleted file mode 100644 index f0752ac6..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems - SOLUTIONS/Singly Linked List Cycle Check - SOLUTION.ipynb +++ /dev/null @@ -1,169 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Singly Linked List Cycle Check - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "Given a singly linked list, write a function which takes in the first node in a singly linked list and returns a boolean indicating if the linked list contains a \"cycle\".\n", - "\n", - "A cycle is when a node's next point actually points back to a previous node in the list. This is also sometimes known as a circularly linked list.\n", - "\n", - "You've been given the Linked List Node class code:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "To solve this problem we will have two markers traversing through the list. **marker1** and **marker2**. We will have both makers begin at the first node of the list and traverse through the linked list. However the second marker, marker2, will move two nodes ahead for every one node that marker1 moves.\n", - "\n", - "By this logic we can imagine that the markers are \"racing\" through the linked list, with marker2 moving faster. If the linked list has a cylce and is circularly connected we will have the analogy of a track, in this case the marker2 will eventually be \"lapping\" the marker1 and they will equal each other. \n", - "\n", - "If the linked list has no cycle, then marker2 should be able to continue on until the very end, never equaling the first marker.\n", - "\n", - "Let's see this logic coded out:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def cycle_check(node):\n", - "\n", - " # Begin both markers at the first node\n", - " marker1 = node\n", - " marker2 = node\n", - "\n", - " # Go until end of list\n", - " while marker2 != None and marker2.nextnode != None:\n", - " \n", - " # Note\n", - " marker1 = marker1.nextnode\n", - " marker2 = marker2.nextnode.nextnode\n", - "\n", - " # Check if the markers have matched\n", - " if marker2 == marker1:\n", - " return True\n", - "\n", - " # Case where marker ahead reaches the end of the list\n", - " return False" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "# CREATE CYCLE LIST\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = a # Cycle Here!\n", - "\n", - "\n", - "# CREATE NON CYCLE LIST\n", - "x = Node(1)\n", - "y = Node(2)\n", - "z = Node(3)\n", - "\n", - "x.nextnode = y\n", - "y.nextnode = z\n", - "\n", - "\n", - "#############\n", - "class TestCycleCheck(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(a),True)\n", - " assert_equal(sol(x),False)\n", - " \n", - " print \"ALL TEST CASES PASSED\"\n", - " \n", - "# Run Tests\n", - "\n", - "t = TestCycleCheck()\n", - "t.test(cycle_check)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Implement a Doubly Linked List-checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Implement a Doubly Linked List-checkpoint.ipynb deleted file mode 100644 index 047d0421..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Implement a Doubly Linked List-checkpoint.ipynb +++ /dev/null @@ -1,67 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Doubly Linked List\n", - "\n", - "For this interview problem, implement a node class and show how it can be used to create a doubly linked list." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create a Doubly Linked List here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "Note that there is no test for this solution (because it would give away the answer structure).\n", - "\n", - "Check out the Implement a Linked List Solution Notebook for the answer to this interview problem, as well as the answer for the implementation of a singly linked list." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Implement a Singly Linked List-checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Implement a Singly Linked List-checkpoint.ipynb deleted file mode 100644 index 92b84693..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Implement a Singly Linked List-checkpoint.ipynb +++ /dev/null @@ -1,68 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Singly Linked List\n", - "\n", - "For this interview problem, create a node class and show how it can be used to create a Singly Linked List" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create a Singly Linked List here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "Note that there is no test for this solution (because it would give away the answer structure).\n", - "\n", - "Check out the Implement a Linked List Solution Notebook for the answer to this interview problem, as well as the answer for the implementation of a doubly linked list." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Linked List Nth to Last Node -checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Linked List Nth to Last Node -checkpoint.ipynb deleted file mode 100644 index de16594d..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Linked List Nth to Last Node -checkpoint.ipynb +++ /dev/null @@ -1,186 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Linked List Nth to Last Node \n", - "\n", - "## Problem Statement\n", - "Write a function that takes a head node and an integer value **n** and then returns the nth to last node in the linked list. For example, given:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node:\n", - "\n", - " def __init__(self, value):\n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Example Input and Output:**" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "e = Node(5)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d\n", - "d.nextnode = e\n", - "\n", - "# This would return the node d with a value of 4, because its the 2nd to last node.\n", - "target_node = nth_to_last_node(2, a) " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "4" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "target_node.value" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def nth_to_last_node(n, head):\n", - "\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION AGAINST A TEST CASE \n", - "\n", - "PLEASE NOTE THIS IS JUST ONE CASE\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "e = Node(5)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d\n", - "d.nextnode = e\n", - "\n", - "####\n", - "\n", - "class TestNLast(object):\n", - " \n", - " def test(self,sol):\n", - " \n", - " assert_equal(sol(2,a),d)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run tests\n", - "t = TestNLast()\n", - "t.test(nth_to_last_node)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Linked List Reversal -checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Linked List Reversal -checkpoint.ipynb deleted file mode 100644 index d6d333eb..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Linked List Reversal -checkpoint.ipynb +++ /dev/null @@ -1,244 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Linked List Reversal \n", - "\n", - "## Problem\n", - "\n", - "Write a function to reverse a Linked List in place. The function will take in the head of the list as input and return the new head of the list.\n", - "\n", - "You are given the example Linked List Node class:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def reverse(head):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "**Note, this isn't a classic run cell for testing your solution, please read the statements below carefully**\n", - "\n", - "You should be able to easily test your own solution to make sure it works. Given the short list a,b,c,d with values 1,2,3,4. Check the effect of your reverse function and make sure the results match the logic here below:" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create a list of 4 nodes\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "\n", - "# Set up order a,b,c,d with values 1,2,3,4\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's check the values of the nodes coming after a, b and c:" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n", - "3\n", - "4\n" - ] - } - ], - "source": [ - "print a.nextnode.value\n", - "print b.nextnode.value\n", - "print c.nextnode.value" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'value'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" - ] - } - ], - "source": [ - "d.nextnode.value" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So far so good. Note how there is no value proceeding the last node, this makes sense! Now let's reverse the linked list, we should see the opposite order of values!" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "<__main__.Node at 0x104bd7dd0>" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "reverse(a)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n", - "2\n", - "1\n" - ] - } - ], - "source": [ - "print d.nextnode.value\n", - "print c.nextnode.value\n", - "print b.nextnode.value" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'value'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m \u001b[0;31m# This will give an error since it now points to None\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" - ] - } - ], - "source": [ - "print a.nextnode.value # This will give an error since it now points to None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great, now we can see that each of the values points to its previous value (although now that the linked list is reversed we can see the ordering has also reversed)\n", - "\n", - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Singly Linked List Cycle Check-checkpoint.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Singly Linked List Cycle Check-checkpoint.ipynb deleted file mode 100644 index 8c41dde7..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /.ipynb_checkpoints/Singly Linked List Cycle Check-checkpoint.ipynb +++ /dev/null @@ -1,147 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Singly Linked List Cycle Check \n", - "\n", - "## Problem\n", - "\n", - "Given a singly linked list, write a function which takes in the first node in a singly linked list and returns a boolean indicating if the linked list contains a \"cycle\".\n", - "\n", - "A cycle is when a node's next point actually points back to a previous node in the list. This is also sometimes known as a circularly linked list.\n", - "\n", - "You've been given the Linked List Node class code:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "Fill out your solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def cycle_check(node):\n", - "\n", - " pass #Your function should return a boolean" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "# CREATE CYCLE LIST\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = a # Cycle Here!\n", - "\n", - "\n", - "# CREATE NON CYCLE LIST\n", - "x = Node(1)\n", - "y = Node(2)\n", - "z = Node(3)\n", - "\n", - "x.nextnode = y\n", - "y.nextnode = z\n", - "\n", - "\n", - "#############\n", - "class TestCycleCheck(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(a),True)\n", - " assert_equal(sol(x),False)\n", - " \n", - " print \"ALL TEST CASES PASSED\"\n", - " \n", - "# Run Tests\n", - "\n", - "t = TestCycleCheck()\n", - "t.test(cycle_check)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Implement a Doubly Linked List.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Implement a Doubly Linked List.ipynb deleted file mode 100644 index 047d0421..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Implement a Doubly Linked List.ipynb +++ /dev/null @@ -1,67 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Doubly Linked List\n", - "\n", - "For this interview problem, implement a node class and show how it can be used to create a doubly linked list." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create a Doubly Linked List here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "Note that there is no test for this solution (because it would give away the answer structure).\n", - "\n", - "Check out the Implement a Linked List Solution Notebook for the answer to this interview problem, as well as the answer for the implementation of a singly linked list." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Implement a Singly Linked List.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Implement a Singly Linked List.ipynb deleted file mode 100644 index 92b84693..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Implement a Singly Linked List.ipynb +++ /dev/null @@ -1,68 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Singly Linked List\n", - "\n", - "For this interview problem, create a node class and show how it can be used to create a Singly Linked List" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create a Singly Linked List here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "Note that there is no test for this solution (because it would give away the answer structure).\n", - "\n", - "Check out the Implement a Linked List Solution Notebook for the answer to this interview problem, as well as the answer for the implementation of a doubly linked list." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Linked List Nth to Last Node .ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Linked List Nth to Last Node .ipynb deleted file mode 100644 index de16594d..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Linked List Nth to Last Node .ipynb +++ /dev/null @@ -1,186 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Linked List Nth to Last Node \n", - "\n", - "## Problem Statement\n", - "Write a function that takes a head node and an integer value **n** and then returns the nth to last node in the linked list. For example, given:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node:\n", - "\n", - " def __init__(self, value):\n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Example Input and Output:**" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "e = Node(5)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d\n", - "d.nextnode = e\n", - "\n", - "# This would return the node d with a value of 4, because its the 2nd to last node.\n", - "target_node = nth_to_last_node(2, a) " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "4" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "target_node.value" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def nth_to_last_node(n, head):\n", - "\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION AGAINST A TEST CASE \n", - "\n", - "PLEASE NOTE THIS IS JUST ONE CASE\n", - "\"\"\"\n", - "\n", - "from nose.tools import assert_equal\n", - "\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "e = Node(5)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d\n", - "d.nextnode = e\n", - "\n", - "####\n", - "\n", - "class TestNLast(object):\n", - " \n", - " def test(self,sol):\n", - " \n", - " assert_equal(sol(2,a),d)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run tests\n", - "t = TestNLast()\n", - "t.test(nth_to_last_node)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Linked List Reversal .ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Linked List Reversal .ipynb deleted file mode 100644 index d6d333eb..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Linked List Reversal .ipynb +++ /dev/null @@ -1,244 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Linked List Reversal \n", - "\n", - "## Problem\n", - "\n", - "Write a function to reverse a Linked List in place. The function will take in the head of the list as input and return the new head of the list.\n", - "\n", - "You are given the example Linked List Node class:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def reverse(head):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "**Note, this isn't a classic run cell for testing your solution, please read the statements below carefully**\n", - "\n", - "You should be able to easily test your own solution to make sure it works. Given the short list a,b,c,d with values 1,2,3,4. Check the effect of your reverse function and make sure the results match the logic here below:" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create a list of 4 nodes\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "d = Node(4)\n", - "\n", - "# Set up order a,b,c,d with values 1,2,3,4\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = d" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's check the values of the nodes coming after a, b and c:" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n", - "3\n", - "4\n" - ] - } - ], - "source": [ - "print a.nextnode.value\n", - "print b.nextnode.value\n", - "print c.nextnode.value" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'value'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" - ] - } - ], - "source": [ - "d.nextnode.value" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So far so good. Note how there is no value proceeding the last node, this makes sense! Now let's reverse the linked list, we should see the opposite order of values!" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "<__main__.Node at 0x104bd7dd0>" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "reverse(a)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n", - "2\n", - "1\n" - ] - } - ], - "source": [ - "print d.nextnode.value\n", - "print c.nextnode.value\n", - "print b.nextnode.value" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'NoneType' object has no attribute 'value'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnextnode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m \u001b[0;31m# This will give an error since it now points to None\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'value'" - ] - } - ], - "source": [ - "print a.nextnode.value # This will give an error since it now points to None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great, now we can see that each of the values points to its previous value (although now that the linked list is reversed we can see the ordering has also reversed)\n", - "\n", - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Singly Linked List Cycle Check.ipynb b/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Singly Linked List Cycle Check.ipynb deleted file mode 100644 index 8c41dde7..00000000 --- a/Linked Lists/Linked Lists Interview Problems/Linked List Interview Problems /Singly Linked List Cycle Check.ipynb +++ /dev/null @@ -1,147 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Singly Linked List Cycle Check \n", - "\n", - "## Problem\n", - "\n", - "Given a singly linked list, write a function which takes in the first node in a singly linked list and returns a boolean indicating if the linked list contains a \"cycle\".\n", - "\n", - "A cycle is when a node's next point actually points back to a previous node in the list. This is also sometimes known as a circularly linked list.\n", - "\n", - "You've been given the Linked List Node class code:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "Fill out your solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def cycle_check(node):\n", - "\n", - " pass #Your function should return a boolean" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "# CREATE CYCLE LIST\n", - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)\n", - "\n", - "a.nextnode = b\n", - "b.nextnode = c\n", - "c.nextnode = a # Cycle Here!\n", - "\n", - "\n", - "# CREATE NON CYCLE LIST\n", - "x = Node(1)\n", - "y = Node(2)\n", - "z = Node(3)\n", - "\n", - "x.nextnode = y\n", - "y.nextnode = z\n", - "\n", - "\n", - "#############\n", - "class TestCycleCheck(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol(a),True)\n", - " assert_equal(sol(x),False)\n", - " \n", - " print \"ALL TEST CASES PASSED\"\n", - " \n", - "# Run Tests\n", - "\n", - "t = TestCycleCheck()\n", - "t.test(cycle_check)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Singly Linked List Implementation.ipynb b/Linked Lists/Singly Linked List Implementation.ipynb deleted file mode 100644 index efa1ee5c..00000000 --- a/Linked Lists/Singly Linked List Implementation.ipynb +++ /dev/null @@ -1,120 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Singly Linked List Implementation\n", - "\n", - "In this lecture we will implement a basic Singly Linked List.\n", - "\n", - "Remember, in a singly linked list, we have an ordered list of items as individual Nodes that have pointers to other Nodes." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Node(object):\n", - " \n", - " def __init__(self,value):\n", - " \n", - " self.value = value\n", - " self.nextnode = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can build out Linked List with the collection of nodes:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "a = Node(1)\n", - "b = Node(2)\n", - "c = Node(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "a.nextnode = b" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "b.nextnode = c" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In a Linked List the first node is called the **head** and the last node is called the **tail**. Let's discuss the pros and cons of Linked Lists:\n", - "\n", - "## Pros\n", - "\n", - "* Linked Lists have constant-time insertions and deletions in any position, in comparison, arrays require O(n) time to do the same thing.\n", - "\n", - "* Linked lists can continue to expand without having to specify their size ahead of time (remember our lectures on Array sizing form the Array Sequence section of the course!)\n", - "\n", - "## Cons\n", - "\n", - "* To access an element in a linked list, you need to take O(k) time to go from the head of the list to the kth element. In contrast, arrays have constant time operations to access elements in an array." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!\n", - "\n", - "That's it for the implementation (pretty simple right?). Up next we will learn about Doubly Linked Lists!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Linked Lists/Singly Linked Lists.ipynb b/Linked Lists/Singly Linked Lists.ipynb deleted file mode 100644 index f0f1677d..00000000 --- a/Linked Lists/Singly Linked Lists.ipynb +++ /dev/null @@ -1,36 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# Singly Linked Lists\n", - "\n", - "**Please refer to the Lecture Video for full Explanation of Singly Linked Lists**" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 2ac17359..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,232 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** You've been given a list of historical stock prices for a single day for Amazon stock. The index of the list represents the timestamp, so the element at index of 0 is the initial price of the stock, the element at index 1 is the next recorded price of the stock for that day, etc. Your task is to write a function that will return the maximum profit possible from the purchase and sale of a single share of Amazon stock on that day. Keep in mind to try to make this as efficient as possible.**\n", - "\n", - "\n", - "For example, if you were given the list of stock prices:\n", - "\n", - "prices = [12,11,15,3,10]\n", - "\n", - "Then your function would return the maximum possible profit, which would be 7 (buying at 3 and selling at 10).\n", - "\n", - "## Requirements\n", - "\n", - "** Try to solve this problem with paper/pencil first without using an IDE. Also keep in mind you should be able to come up with a better solution than just brute forcing every possible sale combination **\n", - "\n", - "** Also you can't \"short\" a stock, you must buy *before* you sell the stock. **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "Let's think about a few things before we start coding. One thing to think about right off the bat is that we can't just find the maximum price and the lowest price and then subtract the two, because the max could come before the min.\n", - "\n", - "The brute force method would be to try every possible pair of price combinations, but this would be O(N^2), pretty bad. Also since this is an interview setting you should probably already know that there is a smarter solution.\n", - "\n", - "In this case we will use a [greedy algorithm](https://en.wikipedia.org/wiki/Greedy_algorithm) approach. We will iterate through the list of stock prices while keeping track of our maximum profit.\n", - "\n", - "That means for every price we will keep track of the lowest price so far and then check if we can get a better profit than our current max.\n", - "\n", - "Let's see an implementation of this:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def profit(stock_prices):\n", - " \n", - " # Start minimum price marker at first price\n", - " min_stock_price = stock_prices[0]\n", - " \n", - " # Start off with a profit of zero\n", - " max_profit = 0\n", - " \n", - " for price in stock_prices:\n", - " \n", - " # Check to set the lowest stock price so far\n", - " min_stock_price = min(min_stock_price,price)\n", - " \n", - " # Check the current price against our minimum for a profit \n", - " # comparison against the max_profit\n", - " comparison_profit = price - min_stock_price\n", - " \n", - " # Compare against our max_profit so far\n", - " max_profit = max(max_profit,comparison_profit)\n", - " \n", - " return max_profit" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "39" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "profit([10,12,14,12,13,11,8,7,6,13,23,45,11,10])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Currently we're finding the max profit in one pass O(n) and in constant space O(1). However, we still aren't thinking about any edge cases. For example, we need to address the following scenarios:\n", - "\n", - "* Stock price always goes down\n", - "* If there's less than two stock prices in the list.\n", - "\n", - "We can take care of the first scenario by returning a negative profit if the price decreases all day (that way we can know how much we lost). And the second issue can be solved with a quick **len()** check. Let's see the full solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def profit2(stock_prices):\n", - " \n", - " # Check length\n", - " if len(stock_prices) < 2:\n", - " raise Exception('Need at least two stock prices!')\n", - " \n", - " # Start minimum price marker at first price\n", - " min_stock_price = stock_prices[0]\n", - " \n", - " # Start off with an initial max profit\n", - " max_profit = stock_prices[1] - stock_prices[0]\n", - " \n", - " # Skip first index of 0\n", - " for price in stock_prices[1:]:\n", - " \n", - " \n", - " # NOTE THE REORDERING HERE DUE TO THE NEGATIVE PROFIT TRACKING\n", - " \n", - " # Check the current price against our minimum for a profit \n", - " # comparison against the max_profit\n", - " comparison_profit = price - min_stock_price\n", - " \n", - " # Compare against our max_profit so far\n", - " max_profit = max(max_profit,comparison_profit)\n", - " \n", - " # Check to set the lowest stock price so far\n", - " min_stock_price = min(min_stock_price,price)\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " return max_profit" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "Exception", - "evalue": "Need at least two stock prices!", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Exception Raised\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprofit2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mprofit2\u001b[0;34m(stock_prices)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# Check length\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstock_prices\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Need at least two stock prices!'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m# Start minimum price marker at first price\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mException\u001b[0m: Need at least two stock prices!" - ] - } - ], - "source": [ - "# Exception Raised\n", - "profit2([1])" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "-1" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "profit2([30,22,21,5])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great! Now we can prepare for worst case scenarios. Its important to keep edge cases in mind, especially if you are able to solve the original question fairly quickly.\n", - "\n", - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index f4f594ff..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,164 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers, write a function that will return a list, in which for each index the element will be the product of all the integers except for the element at that index **\n", - "\n", - "**For example, an input of [1,2,3,4] would return [24,12,8,6] by performing [2×3×4,1×3×4,1×2×4,1×2×3] **\n", - "\n", - "## Requirements\n", - "\n", - "** You can not use division in your answer! Meaning you can't simply multiply all the numbers and then divide by eahc element for each index!**\n", - "\n", - "** Try to do this on a white board or with paper/pencil.**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "___\n", - "## Solution\n", - "\n", - "If you look at the list above with the multiplication you'll notice we are repeating multiplications, such as 2 times 3 or 3 times 4 for multiple entries in the new list. \n", - "\n", - "We'll want to take a greedy approach and keep track of these results for later re-use at other indices. We'll also need to think about what if a number is zero!\n", - "\n", - "In order to find the products of all the integers (except for the integer at that index) we will actually go through our list twice in a greedy fashion. \n", - "\n", - "On the first pass we will get the products of all the integers **before** each index, and then on the second pass we will go **backwards** to get the products of all the integers after each index.\n", - "\n", - "Then we just need to multiply all the products before and after each index in order to get the final product answer!\n", - "\n", - "Let's see this in action:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def index_prod(lst):\n", - " \n", - " # Create an empty output list\n", - " output = [None] * len(lst)\n", - " \n", - " # Set initial product and index for greedy run forward\n", - " product = 1\n", - " i = 0\n", - " \n", - " while i < len(lst):\n", - " \n", - " # Set index as cumulative product\n", - " output[i] = product\n", - " \n", - " # Cumulative product\n", - " product *= lst[i]\n", - " \n", - " # Move forward\n", - " i +=1\n", - " \n", - " \n", - " # Now for our Greedy run Backwards\n", - " product = 1\n", - " \n", - " # Start index at last (taking into account index 0)\n", - " i = len(lst) - 1\n", - " \n", - " # Until the beginning of the list\n", - " while i >=0:\n", - " \n", - " # Same operations as before, just backwards\n", - " output[i] *= product\n", - " product *= lst[i]\n", - " i -= 1\n", - " \n", - " return output " - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[24, 12, 8, 6]" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "index_prod([1,2,3,4])" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[24, 0, 0, 0, 0]" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "index_prod([0,1,2,3,4])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Review the solution and make sure you understand it! It uses O(n) time and O(n) space complexity!\n", - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index f3b22b3b..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,196 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "**Given two rectangles, determine if they overlap. The rectangles are defined as a Dictionary, for example:**" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "r1 = {\n", - " \n", - " # x and y coordinates of the bottom-left corner of the rectangle\n", - " 'x': 2 , 'y': 4,\n", - " \n", - " # Width and Height of rectangle\n", - " 'w':5,'h':12}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "** If the rectangles do overlap, return the dictionary which describes the overlapping section**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Requirements\n", - "\n", - "** Make sure the dictionary you output is in the same form as the input.**\n", - "\n", - "** Feel free to use an IDE for the code, but make sure you use paper/pencil or whiteboard to draw out your plan and logic**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "This is a problem where it helps a lot to draw out your thinking. There are a few things we will need to think about:\n", - "\n", - "* How can we determine an intersection?\n", - "* What if a rectangle is fully inside another rectangle?\n", - "* What if there is no intersection, but the rectangles share an edge?\n", - "\n", - "The key to solving this problem is to *break it up in to sub-problems*. We can split up the problem into an x-axis problem and a y-axis problem. \n", - "\n", - "We will create a function that can detect overlap in 1 dimension. Then we will split the rectangles into x and width, and y and height components. We can then determine that if there is overlap on both dimensions, then the rectangles themselves intersect!\n", - "\n", - "In order to understand the **calc_overlap** function, draw out two flat lines and follow along with the function and notice how it detects an overlap!\n", - "\n", - "Let's begin by creating a general function to detect overlap in a single dimension:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def calc_overlap(coor1,dim1,coor2,dim2):\n", - " \"\"\"\n", - " Takes in 2 coordinates and their length in that dimension\n", - " \"\"\"\n", - " \n", - " # Find greater of the two coordinates\n", - " # (this is either the point to the most right\n", - " # or the higher point, depending on the dimension)\n", - " \n", - " # The greater point would be the start of the overlap\n", - " greater = max(coor1,coor2)\n", - " \n", - " # The lower point is the end of the overlap\n", - " lower = min(coor1+dim1,coor2+dim2)\n", - " \n", - " # Return a tuple of Nones if there is no overlap\n", - " \n", - " if greater >= lower:\n", - " return (None,None)\n", - " \n", - " # Otherwise, get the overlap length\n", - " overlap = lower-greater\n", - " \n", - " return (greater,overlap)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's use this function to detect if the rectangles overlap!" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def calc_rect_overlap(r1,r2):\n", - " \n", - " \n", - " x_overlap, w_overlap = calc_overlap(r1['x'],r1['w'],r2['x'],r2['w'])\n", - " \n", - " y_overlap, h_overlap = calc_overlap(r1['y'],r1['h'],r2['y'],r2['h'])\n", - " \n", - " # If either returned None tuples, then there is no overlap!\n", - " if not w_overlap or not h_overlap:\n", - " print 'There was no overlap!'\n", - " return None\n", - " \n", - " # Otherwise return the dictionary format of the overlapping rectangle\n", - " return { 'x':x_overlap,'y': y_overlap,'w':w_overlap,'h':h_overlap}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our solution is O(1) for both time and space! Let's see it in action:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'h': 11, 'w': 5, 'x': 2, 'y': 5}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "r1 = {'x': 2 , 'y': 4,'w':5,'h':12}\n", - "r2 = {'x': 1 , 'y': 5,'w':7,'h':14}\n", - "calc_rect_overlap(r1,r2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make sure to review the answer and practice writing it out by hand!\n", - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 042f7a06..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,85 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "**A tower has 100 floors. You've been given two eggs. The eggs are strong enough that they can be dropped from a particular floor in the tower without breaking. You've been tasked to find the highest floor an egg can be dropped without breaking, in as few drops as possible. If an egg is dropped from above its target floor it will break. If it is dropped from that floor or below, it will be intact and you can test drop the egg again on another floor.**\n", - "\n", - "**Show algorithmically how you would go about doing this in as few drops as possible**\n", - "## Requirements\n", - "\n", - "** Use paper/pencil or a whiteboard for this problem **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "** We've already seen this problem in the Riddles section, here is the answer from that section.(Alternatively just google \"2 eggs 100 floors\" for a plethora of explanations regarding this same solution **\n", - "\n", - "\n", - "Start from the 10th floor and go up to floors in multiples of 10.\n", - "\n", - "If first egg breaks, say at 20th floor then you can check all the floors between 11th and 19th with the second egg to see which floor it will not break.\n", - "\n", - "In this case, the worst-case number of drops is 19. If the threshold was 99th floor, then you would have to drop the first egg 10 times and the second egg 9 times in linear fashion.\n", - "\n", - "**Best solution:**\n", - "We need to minimize this worst-case number of drops. For that, we need to generalize the problem to have n floors. What would be the step value, for the first egg? Would it still be 10? Suppose we have 200 floors. Would the step value be still 10? \n", - "\n", - "The point to note here is that we are trying to minimize the worst-case number of drops which happens if the threshold is at the highest floors. So, our steps should be of some value which reduces the number of drops of the first egg.\n", - "\n", - "Let's assume we take some step value m initially. If every subsequent step is m-1,\n", - "then, \n", - "$$m+m−1+m−2+.....+1=n$$\n", - "\n", - "This is \n", - "\n", - "$$\\frac{m∗(m+1)}{2}=n$$\n", - "\n", - "If n =100, then m would be 13.65 which since we can't drop from a decimal of a floor, we actually use 14.\n", - "\n", - "So, the worst case scenario is now when the threshold is in the first 14 floors with number of drops being 14.\n", - "\n", - "Note that this is simply a binary search!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb deleted file mode 100644 index c33d49c1..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb +++ /dev/null @@ -1,226 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** You've been given a list of historical stock prices for a single day for Amazon stock. The index of the list represents the timestamp, so the element at index of 0 is the initial price of the stock, the element at index 1 is the next recorded price of the stock for that day, etc. Your task is to write a function that will return the maximum profit possible from the purchase and sale of a single share of Amazon stock on that day. Keep in mind to try to make this as efficient as possible.**\n", - "\n", - "\n", - "For example, if you were given the list of stock prices:\n", - "\n", - "prices = [12,11,15,3,10]\n", - "\n", - "Then your function would return the maximum possible profit, which would be 7 (buying at 3 and selling at 10).\n", - "\n", - "## Requirements\n", - "\n", - "** Try to solve this problem with paper/pencil first without using an IDE. Also keep in mind you should be able to come up with a better solution than just brute forcing every possible sale combination **\n", - "\n", - "** Also you can't \"short\" a stock, you must buy *before* you sell the stock. **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "Let's think about a few things before we start coding. One thing to think about right off the bat is that we can't just find the maximum price and the lowest price and then subtract the two, because the max could come before the min.\n", - "\n", - "The brute force method would be to try every possible pair of price combinations, but this would be O(N^2), pretty bad. Also since this is an interview setting you should probably already know that there is a smarter solution.\n", - "\n", - "In this case we will use a [greedy algorithm](https://en.wikipedia.org/wiki/Greedy_algorithm) approach. We will iterate through the list of stock prices while keeping track of our maximum profit.\n", - "\n", - "That means for every price we will keep track of the lowest price so far and then check if we can get a better profit than our current max.\n", - "\n", - "Let's see an implementation of this:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def profit(stock_prices):\n", - " \n", - " # Start minimum price marker at first price\n", - " min_stock_price = stock_prices[0]\n", - " \n", - " # Start off with a profit of zero\n", - " max_profit = 0\n", - " \n", - " for price in stock_prices:\n", - " \n", - " # Check to set the lowest stock price so far\n", - " min_stock_price = min(min_stock_price,price)\n", - " \n", - " # Check the current price against our minimum for a profit \n", - " # comparison against the max_profit\n", - " comparison_profit = price - min_stock_price\n", - " \n", - " # Compare against our max_profit so far\n", - " max_profit = max(max_profit,comparison_profit)\n", - " \n", - " return max_profit" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "39" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "profit([10,12,14,12,13,11,8,7,6,13,23,45,11,10])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Currently we're finding the max profit in one pass O(n) and in constant space O(1). However, we still aren't thinking about any edge cases. For example, we need to address the following scenarios:\n", - "\n", - "* Stock price always goes down\n", - "* If there's less than two stock prices in the list.\n", - "\n", - "We can take care of the first scenario by returning a negative profit if the price decreases all day (that way we can know how much we lost). And the second issue can be solved with a quick **len()** check. Let's see the full solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def profit2(stock_prices):\n", - " \n", - " # Check length\n", - " if len(stock_prices) < 2:\n", - " raise Exception('Need at least two stock prices!')\n", - " \n", - " # Start minimum price marker at first price\n", - " min_stock_price = stock_prices[0]\n", - " \n", - " # Start off with an initial max profit\n", - " max_profit = stock_prices[1] - stock_prices[0]\n", - " \n", - " # Skip first index of 0\n", - " for price in stock_prices[1:]:\n", - " \n", - " \n", - " # NOTE THE REORDERING HERE DUE TO THE NEGATIVE PROFIT TRACKING\n", - " \n", - " # Check the current price against our minimum for a profit \n", - " # comparison against the max_profit\n", - " comparison_profit = price - min_stock_price\n", - " \n", - " # Compare against our max_profit so far\n", - " max_profit = max(max_profit,comparison_profit)\n", - " \n", - " # Check to set the lowest stock price so far\n", - " min_stock_price = min(min_stock_price,price)\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " return max_profit" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "ename": "Exception", - "evalue": "Need at least two stock prices!", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Exception Raised\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprofit2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mprofit2\u001b[0;34m(stock_prices)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# Check length\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstock_prices\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Need at least two stock prices!'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m# Start minimum price marker at first price\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mException\u001b[0m: Need at least two stock prices!" - ] - } - ], - "source": [ - "# Exception Raised\n", - "profit2([1])" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-1" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "profit2([30,22,21,5])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great! Now we can prepare for worst case scenarios. Its important to keep edge cases in mind, especially if you are able to solve the original question fairly quickly.\n", - "\n", - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb deleted file mode 100644 index ba4352ba..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb +++ /dev/null @@ -1,160 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers, write a function that will return a list, in which for each index the element will be the product of all the integers except for the element at that index **\n", - "\n", - "**For example, an input of [1,2,3,4] would return [24,12,8,6] by performing [2×3×4,1×3×4,1×2×4,1×2×3] **\n", - "\n", - "## Requirements\n", - "\n", - "** You can not use division in your answer! Meaning you can't simply multiply all the numbers and then divide by eahc element for each index!**\n", - "\n", - "** Try to do this on a white board or with paper/pencil.**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "___\n", - "## Solution\n", - "\n", - "If you look at the list above with the multiplication you'll notice we are repeating multiplications, such as 2 times 3 or 3 times 4 for multiple entries in the new list. \n", - "\n", - "We'll want to take a greedy approach and keep track of these results for later re-use at other indices. We'll also need to think about what if a number is zero!\n", - "\n", - "In order to find the products of all the integers (except for the integer at that index) we will actually go through our list twice in a greedy fashion. \n", - "\n", - "On the first pass we will get the products of all the integers **before** each index, and then on the second pass we will go **backwards** to get the products of all the integers after each index.\n", - "\n", - "Then we just need to multiply all the products before and after each index in order to get the final product answer!\n", - "\n", - "Let's see this in action:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def index_prod(lst):\n", - " \n", - " # Create an empty output list\n", - " output = [None] * len(lst)\n", - " \n", - " # Set initial product and index for greedy run forward\n", - " product = 1\n", - " i = 0\n", - " \n", - " while i < len(lst):\n", - " \n", - " # Set index as cumulative product\n", - " output[i] = product\n", - " \n", - " # Cumulative product\n", - " product *= lst[i]\n", - " \n", - " # Move forward\n", - " i +=1\n", - " \n", - " \n", - " # Now for our Greedy run Backwards\n", - " product = 1\n", - " \n", - " # Start index at last (taking into account index 0)\n", - " i = len(lst) - 1\n", - " \n", - " # Until the beginning of the list\n", - " while i >=0:\n", - " \n", - " # Same operations as before, just backwards\n", - " output[i] *= product\n", - " product *= lst[i]\n", - " i -= 1\n", - " \n", - " return output " - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[24, 12, 8, 6]" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "index_prod([1,2,3,4])" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[24, 0, 0, 0, 0]" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "index_prod([0,1,2,3,4])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Review the solution and make sure you understand it! It uses O(n) time and O(n) space complexity!\n", - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb deleted file mode 100644 index f3b22b3b..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb +++ /dev/null @@ -1,196 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "**Given two rectangles, determine if they overlap. The rectangles are defined as a Dictionary, for example:**" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "r1 = {\n", - " \n", - " # x and y coordinates of the bottom-left corner of the rectangle\n", - " 'x': 2 , 'y': 4,\n", - " \n", - " # Width and Height of rectangle\n", - " 'w':5,'h':12}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "** If the rectangles do overlap, return the dictionary which describes the overlapping section**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Requirements\n", - "\n", - "** Make sure the dictionary you output is in the same form as the input.**\n", - "\n", - "** Feel free to use an IDE for the code, but make sure you use paper/pencil or whiteboard to draw out your plan and logic**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "This is a problem where it helps a lot to draw out your thinking. There are a few things we will need to think about:\n", - "\n", - "* How can we determine an intersection?\n", - "* What if a rectangle is fully inside another rectangle?\n", - "* What if there is no intersection, but the rectangles share an edge?\n", - "\n", - "The key to solving this problem is to *break it up in to sub-problems*. We can split up the problem into an x-axis problem and a y-axis problem. \n", - "\n", - "We will create a function that can detect overlap in 1 dimension. Then we will split the rectangles into x and width, and y and height components. We can then determine that if there is overlap on both dimensions, then the rectangles themselves intersect!\n", - "\n", - "In order to understand the **calc_overlap** function, draw out two flat lines and follow along with the function and notice how it detects an overlap!\n", - "\n", - "Let's begin by creating a general function to detect overlap in a single dimension:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def calc_overlap(coor1,dim1,coor2,dim2):\n", - " \"\"\"\n", - " Takes in 2 coordinates and their length in that dimension\n", - " \"\"\"\n", - " \n", - " # Find greater of the two coordinates\n", - " # (this is either the point to the most right\n", - " # or the higher point, depending on the dimension)\n", - " \n", - " # The greater point would be the start of the overlap\n", - " greater = max(coor1,coor2)\n", - " \n", - " # The lower point is the end of the overlap\n", - " lower = min(coor1+dim1,coor2+dim2)\n", - " \n", - " # Return a tuple of Nones if there is no overlap\n", - " \n", - " if greater >= lower:\n", - " return (None,None)\n", - " \n", - " # Otherwise, get the overlap length\n", - " overlap = lower-greater\n", - " \n", - " return (greater,overlap)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's use this function to detect if the rectangles overlap!" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def calc_rect_overlap(r1,r2):\n", - " \n", - " \n", - " x_overlap, w_overlap = calc_overlap(r1['x'],r1['w'],r2['x'],r2['w'])\n", - " \n", - " y_overlap, h_overlap = calc_overlap(r1['y'],r1['h'],r2['y'],r2['h'])\n", - " \n", - " # If either returned None tuples, then there is no overlap!\n", - " if not w_overlap or not h_overlap:\n", - " print 'There was no overlap!'\n", - " return None\n", - " \n", - " # Otherwise return the dictionary format of the overlapping rectangle\n", - " return { 'x':x_overlap,'y': y_overlap,'w':w_overlap,'h':h_overlap}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our solution is O(1) for both time and space! Let's see it in action:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'h': 11, 'w': 5, 'x': 2, 'y': 5}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "r1 = {'x': 2 , 'y': 4,'w':5,'h':12}\n", - "r2 = {'x': 1 , 'y': 5,'w':7,'h':14}\n", - "calc_rect_overlap(r1,r2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make sure to review the answer and practice writing it out by hand!\n", - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/Phone Screen - SOLUTION.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/Phone Screen - SOLUTION.ipynb deleted file mode 100644 index 042f7a06..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems - SOLUTIONS/Phone Screen - SOLUTION.ipynb +++ /dev/null @@ -1,85 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "**A tower has 100 floors. You've been given two eggs. The eggs are strong enough that they can be dropped from a particular floor in the tower without breaking. You've been tasked to find the highest floor an egg can be dropped without breaking, in as few drops as possible. If an egg is dropped from above its target floor it will break. If it is dropped from that floor or below, it will be intact and you can test drop the egg again on another floor.**\n", - "\n", - "**Show algorithmically how you would go about doing this in as few drops as possible**\n", - "## Requirements\n", - "\n", - "** Use paper/pencil or a whiteboard for this problem **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "** We've already seen this problem in the Riddles section, here is the answer from that section.(Alternatively just google \"2 eggs 100 floors\" for a plethora of explanations regarding this same solution **\n", - "\n", - "\n", - "Start from the 10th floor and go up to floors in multiples of 10.\n", - "\n", - "If first egg breaks, say at 20th floor then you can check all the floors between 11th and 19th with the second egg to see which floor it will not break.\n", - "\n", - "In this case, the worst-case number of drops is 19. If the threshold was 99th floor, then you would have to drop the first egg 10 times and the second egg 9 times in linear fashion.\n", - "\n", - "**Best solution:**\n", - "We need to minimize this worst-case number of drops. For that, we need to generalize the problem to have n floors. What would be the step value, for the first egg? Would it still be 10? Suppose we have 200 floors. Would the step value be still 10? \n", - "\n", - "The point to note here is that we are trying to minimize the worst-case number of drops which happens if the threshold is at the highest floors. So, our steps should be of some value which reduces the number of drops of the first egg.\n", - "\n", - "Let's assume we take some step value m initially. If every subsequent step is m-1,\n", - "then, \n", - "$$m+m−1+m−2+.....+1=n$$\n", - "\n", - "This is \n", - "\n", - "$$\\frac{m∗(m+1)}{2}=n$$\n", - "\n", - "If n =100, then m would be 13.65 which since we can't drop from a decimal of a floor, we actually use 14.\n", - "\n", - "So, the worst case scenario is now when the threshold is in the first 14 floors with number of drops being 14.\n", - "\n", - "Note that this is simply a binary search!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb deleted file mode 100644 index 301d05a0..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb +++ /dev/null @@ -1,56 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 \n", - "\n", - "## Problem\n", - "\n", - "** You've been given a list of historical stock prices for a single day for Amazon stock. The index of the list represents the timestamp, so the element at index of 0 is the initial price of the stock, the element at index 1 is the next recorded price of the stock for that day, etc. Your task is to write a function that will return the maximum profit possible from the purchase and sale of a single share of Amazon stock on that day. Keep in mind to try to make this as efficient as possible.**\n", - "\n", - "\n", - "For example, if you were given the list of stock prices:\n", - "\n", - "prices = [12,11,15,3,10]\n", - "\n", - "Then your function would return the maximum possible profit, which would be 7 (buying at 3 and selling at 10).\n", - "\n", - "## Requirements\n", - "\n", - "** Try to solve this problem with paper/pencil first without using an IDE. Also keep in mind you should be able to come up with a better solution than just brute forcing every possible sale combination **\n", - "\n", - "** Also you can't \"short\" a stock, you must buy *before* you sell the stock. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb deleted file mode 100644 index 03231384..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb +++ /dev/null @@ -1,51 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 \n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers, write a function that will return a list, in which for each index the element will be the product of all the integers except for the element at that index **\n", - "\n", - "**For example, an input of [1,2,3,4] would return [24,12,8,6] by performing [2×3×4,1×3×4,1×2×4,1×2×3] **\n", - "\n", - "## Requirements\n", - "\n", - "** You can not use division in your answer! Meaning you can't simply multiply all the numbers and then divide by eahc element for each index!**\n", - "\n", - "** Try to do this on a white board or with paper/pencil.**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb deleted file mode 100644 index b7d2c7e4..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb +++ /dev/null @@ -1,78 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3\n", - "\n", - "## Problem\n", - "\n", - "**Given two rectangles, determine if they overlap. The rectangles are defined as a Dictionary, for example:**" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "r1 = {\n", - " \n", - " # x and y coordinates of the bottom-left corner of the rectangle\n", - " 'x': 2 , 'y': 4,\n", - " \n", - " # Width and Height of rectangle\n", - " 'w':5,'h':12}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "** If the rectangles do overlap, return the dictionary which describes the overlapping section**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Requirements\n", - "\n", - "** Make sure the dictionary you output is in the same form as the input.**\n", - "\n", - "** Feel free to use an IDE for the code, but make sure you use paper/pencil or whiteboard to draw out your plan and logic**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/Phone Screen -checkpoint.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/Phone Screen -checkpoint.ipynb deleted file mode 100644 index f9dd3787..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/.ipynb_checkpoints/Phone Screen -checkpoint.ipynb +++ /dev/null @@ -1,49 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen \n", - "\n", - "## Problem\n", - "\n", - "**A tower has 100 floors. You've been given two eggs. The eggs are strong enough that they can be dropped from a particular floor in the tower without breaking. You've been tasked to find the highest floor an egg can be dropped without breaking, in as few drops as possible. If an egg is dropped from above its target floor it will break. If it is dropped from that floor or below, it will be intact and you can test drop the egg again on another floor.**\n", - "\n", - "**Show algorithmically how you would go about doing this in as few drops as possible**\n", - "\n", - "## Requirements\n", - "\n", - "** Use paper/pencil or a whiteboard for this problem **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 1.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 1.ipynb deleted file mode 100644 index 301d05a0..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 1.ipynb +++ /dev/null @@ -1,56 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 \n", - "\n", - "## Problem\n", - "\n", - "** You've been given a list of historical stock prices for a single day for Amazon stock. The index of the list represents the timestamp, so the element at index of 0 is the initial price of the stock, the element at index 1 is the next recorded price of the stock for that day, etc. Your task is to write a function that will return the maximum profit possible from the purchase and sale of a single share of Amazon stock on that day. Keep in mind to try to make this as efficient as possible.**\n", - "\n", - "\n", - "For example, if you were given the list of stock prices:\n", - "\n", - "prices = [12,11,15,3,10]\n", - "\n", - "Then your function would return the maximum possible profit, which would be 7 (buying at 3 and selling at 10).\n", - "\n", - "## Requirements\n", - "\n", - "** Try to solve this problem with paper/pencil first without using an IDE. Also keep in mind you should be able to come up with a better solution than just brute forcing every possible sale combination **\n", - "\n", - "** Also you can't \"short\" a stock, you must buy *before* you sell the stock. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 2 .ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 2 .ipynb deleted file mode 100644 index a68bb887..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 2 .ipynb +++ /dev/null @@ -1,51 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 \n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers, write a function that will return a list, in which for each index the element will be the product of all the integers except for the element at that index **\n", - "\n", - "**For example, an input of [1,2,3,4] would return [24,12,8,6] by performing [2×3×4,1×3×4,1×2×4,1×2×3] **\n", - "\n", - "## Requirements\n", - "\n", - "** You can not use division in your answer! Meaning you can't simply multiply all the numbers and then divide by eahc element for each index!**\n", - "\n", - "** Try to do this on a white board or with paper/pencil.**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 3.ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 3.ipynb deleted file mode 100644 index b7d2c7e4..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/On-Site Question 3.ipynb +++ /dev/null @@ -1,78 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3\n", - "\n", - "## Problem\n", - "\n", - "**Given two rectangles, determine if they overlap. The rectangles are defined as a Dictionary, for example:**" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "r1 = {\n", - " \n", - " # x and y coordinates of the bottom-left corner of the rectangle\n", - " 'x': 2 , 'y': 4,\n", - " \n", - " # Width and Height of rectangle\n", - " 'w':5,'h':12}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "** If the rectangles do overlap, return the dictionary which describes the overlapping section**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Requirements\n", - "\n", - "** Make sure the dictionary you output is in the same form as the input.**\n", - "\n", - "** Feel free to use an IDE for the code, but make sure you use paper/pencil or whiteboard to draw out your plan and logic**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/Phone Screen .ipynb b/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/Phone Screen .ipynb deleted file mode 100644 index f9dd3787..00000000 --- a/Mock Interviews/Large E-Commerce Company/E-Commerce Company - Interview Problems/Phone Screen .ipynb +++ /dev/null @@ -1,49 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen \n", - "\n", - "## Problem\n", - "\n", - "**A tower has 100 floors. You've been given two eggs. The eggs are strong enough that they can be dropped from a particular floor in the tower without breaking. You've been tasked to find the highest floor an egg can be dropped without breaking, in as few drops as possible. If an egg is dropped from above its target floor it will break. If it is dropped from that floor or below, it will be intact and you can test drop the egg again on another floor.**\n", - "\n", - "**Show algorithmically how you would go about doing this in as few drops as possible**\n", - "\n", - "## Requirements\n", - "\n", - "** Use paper/pencil or a whiteboard for this problem **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index df89907a..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,127 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 - SOLUTION\n", - "___\n", - "\n", - "## Question\n", - "** Given a dice which rolls 1 to 7 (with uniform probability), simulate a 5 sided dice. Preferably, write your solution as a function. **\n", - "\n", - "## Requirements\n", - "\n", - "** You MUST do this on pen and paper or on a whiteboard. No actual coding is allowed until you've solved it on pen and paper! **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# SOLUTION\n", - "\n", - "This is a new problem we haven't seen directly before! Many times this question is asked in the form of functions e.g. your given a function random_7() and you have to take it as an input and create random_5()\n", - "\n", - "The key to solving this problem is to make sure you focus on the requirement that the final distribution of the rolls be uniform, also you were not given any requirements on Time and Space, so the solution is actually *very* simple, just keep re-rolling if you get a number greater than 5!\n", - "\n", - "We can code this out:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from random import randint\n", - " \n", - "def dice7():\n", - " return randint(1, 7)\n", - " \n", - "# Our Solution\n", - "def convert7to5():\n", - " \n", - " # Starting roll (just needs to be larger than 5)\n", - " roll = 7\n", - " \n", - " while roll > 5:\n", - " \n", - " roll = dice7()\n", - " print 'dice7() produced a roll of ',roll\n", - " print ' Your final returned roll is below:'\n", - " return roll" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "dice7() produced a roll of 7\n", - "dice7() produced a roll of 5\n", - " Your final returned roll is below:\n" - ] - }, - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "convert7to5()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, the next problem (On-Site Question 2) will be harder, the reverse conversion of rolls! This question should serve as a reminder not to overthink the solution to a question! Keep in mind that our solution has the potential to run for infinity if we keep rolling 6s and 7s (although this is highly unlikely).\n", - "\n", - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 6d44e71a..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,149 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 - SOLUTION\n", - "___\n", - "\n", - "## Question\n", - "** Given a dice which rolls from 1 to 5, simulate a uniform 7 sided dice! **\n", - "\n", - "## Requirements\n", - "\n", - "** You MUST do this on pen and paper or on a whiteboard. No actual coding is allowed until you've come up with a solution by hand! **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# SOLUTION\n", - "\n", - "Because the 5 sided dice can not produce 7 possible outcomes on a single roll, we immediately know that we need to roll the dice at least twice. \n", - "\n", - "If we roll the dice twice we have 25 possible combinations of the results of the two rolls. While 25 is not divisible by 7, 21 is. This means we can implement our previous strategy of throwing out rolls not in our intended range.\n", - "\n", - "It's also important to note that we can't expand the solution to implement more rolls in order to not throw any out, because 5 and 7 are both prime which means that no exponent of 5 will be divisible by 7 no matter how high you go.\n", - "\n", - "We will define our range as a section of the 25 possible combinations of rolls. A good way to do this is by converting the two rolls into a unique outcome number in the range 1 through 25.\n", - "\n", - "We will create this number by taking the rolls, then we take the first roll and after subtracting 1 from it we multiply it by 4. Now the first roll corresponds with a value of 1 - 20.\n", - "\n", - "Then we take the second roll and add it to the result of the first manipulation. Giving us a range of 1-25.\n", - "\n", - "So our final solution is to roll the dice twice. Check the manipulated range from 1 to 25, if its greater than 21, do a reroll. Let's see it in action:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from random import randint\n", - " \n", - "def dice5():\n", - " return randint(1, 5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now for our conversion function:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def convert5to7():\n", - "\n", - " # For constant re-roll purposes\n", - " while True:\n", - "\n", - " # Roll the dice twice\n", - " roll_1 = dice5()\n", - " roll_2 = dice5()\n", - " \n", - " #print 'The rolls were {} and {}'.format(roll_1,roll_2)\n", - "\n", - " # Convert the combination to the range 1 to 25\n", - " num = ( (roll_1-1) * 5 ) + ( roll_2 ) \n", - "\n", - " #print 'The converted range number was:',num\n", - " if num > 21:\n", - "\n", - " # re-roll if we are out of range\n", - " continue\n", - "\n", - " return num %7 + 1 " - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "convert5to7()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 -SOLUTION-checkpoint.ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 -SOLUTION-checkpoint.ipynb deleted file mode 100644 index 1e53ad72..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 -SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,91 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 - SOLUTION\n", - "\n", - "## Question\n", - "\n", - "**Given a string, write a function that uses recursion to reverse it. **\n", - "\n", - "## Requirements\n", - "\n", - "** You MUST use pen and paper or a whiteboard to answer this, no coding allowed! **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# SOLUTION\n", - "\n", - "Hopefully you remember this problem, you've already seen it! The solution is:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def reverse(s):\n", - " \n", - " # Base Case\n", - " if len(s) <= 1:\n", - " return s\n", - "\n", - " # Recursion\n", - " return reverse(s[1:]) + s[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___\n", - "## Notes\n", - "\n", - "Remember when recursion questions arise, think about the base case and the recursive case. Review the recusion section of the course for review for this problem." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 4 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 4 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 8c32f0a1..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/.ipynb_checkpoints/On-Site Question 4 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,263 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 4 - SOLUTION\n", - "\n", - "## Question\n", - "**Find the squareroot of a given number rounded down to the nearest integer, without using the sqrt function. For example, squareroot of a number between [9, 15] should return 3, and [16, 24] should be 4.**\n", - "\n", - "## Requirements\n", - "\n", - "** Feel free to code this out (but its recommended that you use paper/pencil or whiteboard)**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "The squareroot of a (non-negative) number N always lies between 0 and N/2. The straightforward way to solve this problem would be to check every number k between 0 and N/2, until the square of k becomes greater than or rqual to N. If k^2 becomes equal to N, then we return k. Otherwise, we return k-1 because we're rounding down. Here's the code:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(num): \n", - " if num<0: \n", - " raise ValueError \n", - " if num==1: \n", - " return 1 \n", - " for k in range(1+(num/2)): \n", - " if k**2==num: \n", - " return k \n", - " elif k**2>num: \n", - " return k-1 \n", - " return k " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "3" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution(14)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "3" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution(15)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "4" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution(16)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The complexity of this approach is O(N), because we have to check N/2 numbers in the worst case. This linear algorithm is pretty inefficient, we can use some sort of binary search to speed it up. We know that the result is between 0 and N/2, so we can first try N/4 to see whether its square is less than, greater than, or equal to N. If it’s equal then we simply return that value. If it’s less, then we continue our search between N/4 and N/2. Otherwise if it’s greater, then we search between 0 and N/4. In both cases we reduce the potential range by half and continue, this is the logic of binary search. We’re not performing regular binary search though, it’s modified. We want to ensure that we stop at a number k, where k^2<=N but (k+1)^2>N. For example:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def better_solution(num): \n", - " if num<0: \n", - " raise ValueError \n", - " if num==1: \n", - " return 1 \n", - " low=0 \n", - " high=1+(num/2) \n", - " \n", - " while low+1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " Fib(n=15000)\n", - "\n", - "\n", - "loops\n", - "recursion\n", - "generators\n", - "memoization\n", - "memoization as decorator\n", - "\n", - "\n", - "45\n", - "87\n", - "58\n", - "44\n", - "43\n", - "\n", - "\n", - "47\n", - "88\n", - "58\n", - "42\n", - "42\n", - "\n", - "\n", - "51\n", - "92\n", - "60\n", - "44\n", - "43\n", - "\n", - "\n", - "43\n", - "87\n", - "58\n", - "42\n", - "43\n", - "\n", - "\n", - "48\n", - "92\n", - "61\n", - "42\n", - "44\n", - "\n", - "\n", - "45\n", - "87\n", - "59\n", - "43\n", - "44\n", - "\n", - "\n", - "44\n", - "85\n", - "57\n", - "42\n", - "44\n", - "\n", - "\n", - "44\n", - "87\n", - "62\n", - "43\n", - "43\n", - "\n", - "\n", - "48\n", - "86\n", - "59\n", - "42\n", - "43\n", - "\n", - "\n", - "45\n", - "91\n", - "61\n", - "45\n", - "45\n", - "\n", - "\n", - "46\n", - "88.2\n", - "59.3\n", - "42.9\n", - "43.4 (Avg)\n", - "\n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb deleted file mode 100644 index df89907a..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb +++ /dev/null @@ -1,127 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 - SOLUTION\n", - "___\n", - "\n", - "## Question\n", - "** Given a dice which rolls 1 to 7 (with uniform probability), simulate a 5 sided dice. Preferably, write your solution as a function. **\n", - "\n", - "## Requirements\n", - "\n", - "** You MUST do this on pen and paper or on a whiteboard. No actual coding is allowed until you've solved it on pen and paper! **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# SOLUTION\n", - "\n", - "This is a new problem we haven't seen directly before! Many times this question is asked in the form of functions e.g. your given a function random_7() and you have to take it as an input and create random_5()\n", - "\n", - "The key to solving this problem is to make sure you focus on the requirement that the final distribution of the rolls be uniform, also you were not given any requirements on Time and Space, so the solution is actually *very* simple, just keep re-rolling if you get a number greater than 5!\n", - "\n", - "We can code this out:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from random import randint\n", - " \n", - "def dice7():\n", - " return randint(1, 7)\n", - " \n", - "# Our Solution\n", - "def convert7to5():\n", - " \n", - " # Starting roll (just needs to be larger than 5)\n", - " roll = 7\n", - " \n", - " while roll > 5:\n", - " \n", - " roll = dice7()\n", - " print 'dice7() produced a roll of ',roll\n", - " print ' Your final returned roll is below:'\n", - " return roll" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "dice7() produced a roll of 7\n", - "dice7() produced a roll of 5\n", - " Your final returned roll is below:\n" - ] - }, - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "convert7to5()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, the next problem (On-Site Question 2) will be harder, the reverse conversion of rolls! This question should serve as a reminder not to overthink the solution to a question! Keep in mind that our solution has the potential to run for infinity if we keep rolling 6s and 7s (although this is highly unlikely).\n", - "\n", - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb deleted file mode 100644 index b3c51b99..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb +++ /dev/null @@ -1,149 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 - SOLUTION\n", - "___\n", - "\n", - "## Question\n", - "** Given a dice which rolls from 1 to 5, simulate a uniform 7 sided dice! **\n", - "\n", - "## Requirements\n", - "\n", - "** You MUST do this on pen and paper or on a whiteboard. No actual coding is allowed until you've come up with a solution by hand! **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# SOLUTION\n", - "\n", - "Because the 5 sided dice can not produce 7 possible outcomes on a single roll, we immediately know that we need to roll the dice at least twice. \n", - "\n", - "If we roll the dice twice we have 25 possible combinations of the results of the two rolls. While 25 is not divisible by 7, 21 is. This means we can implement our previous strategy of throwing out rolls not in our intended range.\n", - "\n", - "It's also important to note that we can't expand the solution to implement more rolls in order to not throw any out, because 5 and 7 are both prime which means that no exponent of 5 will be divisible by 7 no matter how high you go.\n", - "\n", - "We will define our range as a section of the 25 possible combinations of rolls. A good way to do this is by converting the two rolls into a unique outcome number in the range 1 through 25.\n", - "\n", - "We will create this number by taking the rolls, then we take the first roll and after subtracting 1 from it we multiply it by 5. Now the first roll corresponds with a value of 0, 5, 10, 15 and 20.\n", - "\n", - "Then we take the second roll and add it to the result of the first manipulation. Giving us a range of 1-25.\n", - "\n", - "So our final solution is to roll the dice twice. Check the manipulated range from 1 to 25, if its greater than 21, do a reroll. Let's see it in action:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from random import randint\n", - " \n", - "def dice5():\n", - " return randint(1, 5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now for our conversion function:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def convert5to7():\n", - "\n", - " # For constant re-roll purposes\n", - " while True:\n", - "\n", - " # Roll the dice twice\n", - " roll_1 = dice5()\n", - " roll_2 = dice5()\n", - " \n", - " #print 'The rolls were {} and {}'.format(roll_1,roll_2)\n", - "\n", - " # Convert the combination to the range 1 to 25\n", - " num = ( (roll_1-1) * 5 ) + ( roll_2 ) \n", - "\n", - " #print 'The converted range number was:',num\n", - " if num > 21:\n", - "\n", - " # re-roll if we are out of range\n", - " continue\n", - "\n", - " return num %7 + 1 " - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "convert5to7()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 3 -SOLUTION.ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 3 -SOLUTION.ipynb deleted file mode 100644 index 1e53ad72..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 3 -SOLUTION.ipynb +++ /dev/null @@ -1,91 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 - SOLUTION\n", - "\n", - "## Question\n", - "\n", - "**Given a string, write a function that uses recursion to reverse it. **\n", - "\n", - "## Requirements\n", - "\n", - "** You MUST use pen and paper or a whiteboard to answer this, no coding allowed! **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# SOLUTION\n", - "\n", - "Hopefully you remember this problem, you've already seen it! The solution is:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def reverse(s):\n", - " \n", - " # Base Case\n", - " if len(s) <= 1:\n", - " return s\n", - "\n", - " # Recursion\n", - " return reverse(s[1:]) + s[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___\n", - "## Notes\n", - "\n", - "Remember when recursion questions arise, think about the base case and the recursive case. Review the recusion section of the course for review for this problem." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 4 - SOLUTION.ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 4 - SOLUTION.ipynb deleted file mode 100644 index 8c32f0a1..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems - SOLUTIONS/On-Site Question 4 - SOLUTION.ipynb +++ /dev/null @@ -1,263 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 4 - SOLUTION\n", - "\n", - "## Question\n", - "**Find the squareroot of a given number rounded down to the nearest integer, without using the sqrt function. For example, squareroot of a number between [9, 15] should return 3, and [16, 24] should be 4.**\n", - "\n", - "## Requirements\n", - "\n", - "** Feel free to code this out (but its recommended that you use paper/pencil or whiteboard)**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "The squareroot of a (non-negative) number N always lies between 0 and N/2. The straightforward way to solve this problem would be to check every number k between 0 and N/2, until the square of k becomes greater than or rqual to N. If k^2 becomes equal to N, then we return k. Otherwise, we return k-1 because we're rounding down. Here's the code:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(num): \n", - " if num<0: \n", - " raise ValueError \n", - " if num==1: \n", - " return 1 \n", - " for k in range(1+(num/2)): \n", - " if k**2==num: \n", - " return k \n", - " elif k**2>num: \n", - " return k-1 \n", - " return k " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "3" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution(14)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "3" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution(15)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "4" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution(16)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The complexity of this approach is O(N), because we have to check N/2 numbers in the worst case. This linear algorithm is pretty inefficient, we can use some sort of binary search to speed it up. We know that the result is between 0 and N/2, so we can first try N/4 to see whether its square is less than, greater than, or equal to N. If it’s equal then we simply return that value. If it’s less, then we continue our search between N/4 and N/2. Otherwise if it’s greater, then we search between 0 and N/4. In both cases we reduce the potential range by half and continue, this is the logic of binary search. We’re not performing regular binary search though, it’s modified. We want to ensure that we stop at a number k, where k^2<=N but (k+1)^2>N. For example:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def better_solution(num): \n", - " if num<0: \n", - " raise ValueError \n", - " if num==1: \n", - " return 1 \n", - " low=0 \n", - " high=1+(num/2) \n", - " \n", - " while low+1\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " Fib(n=15000)\n", - "\n", - "\n", - "loops\n", - "recursion\n", - "generators\n", - "memoization\n", - "memoization as decorator\n", - "\n", - "\n", - "45\n", - "87\n", - "58\n", - "44\n", - "43\n", - "\n", - "\n", - "47\n", - "88\n", - "58\n", - "42\n", - "42\n", - "\n", - "\n", - "51\n", - "92\n", - "60\n", - "44\n", - "43\n", - "\n", - "\n", - "43\n", - "87\n", - "58\n", - "42\n", - "43\n", - "\n", - "\n", - "48\n", - "92\n", - "61\n", - "42\n", - "44\n", - "\n", - "\n", - "45\n", - "87\n", - "59\n", - "43\n", - "44\n", - "\n", - "\n", - "44\n", - "85\n", - "57\n", - "42\n", - "44\n", - "\n", - "\n", - "44\n", - "87\n", - "62\n", - "43\n", - "43\n", - "\n", - "\n", - "48\n", - "86\n", - "59\n", - "42\n", - "43\n", - "\n", - "\n", - "45\n", - "91\n", - "61\n", - "45\n", - "45\n", - "\n", - "\n", - "46\n", - "88.2\n", - "59.3\n", - "42.9\n", - "43.4 (Avg)\n", - "\n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb deleted file mode 100644 index c4514711..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb +++ /dev/null @@ -1,54 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 \n", - "___\n", - "\n", - "## Question\n", - "** Given a dice which rolls 1 to 7 (with uniform probability), simulate a 5 sided dice. Preferably, write your solution as a function. **\n", - "\n", - "## Requirements\n", - "\n", - "** You MUST do this on pen and paper or on a whiteboard. No actual coding is allowed until you've solved it on pen and paper! **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb deleted file mode 100644 index a63ca005..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb +++ /dev/null @@ -1,54 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 \n", - "___\n", - "\n", - "## Question\n", - "** Given a dice which rolls from 1 to 5, simulate a uniform 7 sided dice! **\n", - "\n", - "## Requirements\n", - "\n", - "** You MUST do this on pen and paper or on a whiteboard. No actual coding is allowed until you've come up with a solution by hand! **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb deleted file mode 100644 index 49a04c0d..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb +++ /dev/null @@ -1,54 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 \n", - "\n", - "## Question\n", - "\n", - "**Given a string, write a function that uses recursion to reverse it. **\n", - "\n", - "## Requirements\n", - "\n", - "** You MUST use pen and paper or a whiteboard to answer this, no coding allowed! **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 4 -checkpoint.ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 4 -checkpoint.ipynb deleted file mode 100644 index d69bf130..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/On-Site Question 4 -checkpoint.ipynb +++ /dev/null @@ -1,46 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 4 \n", - "\n", - "## Question\n", - "**Find the squareroot of a given number rounded down to the nearest integer, without using the sqrt function. For example, squareroot of a number between [9, 15] should return 3, and [16, 24] should be 4.**\n", - "\n", - "## Requirements\n", - "\n", - "** Feel free to code this out (but its recommended that you use paper/pencil or whiteboard)**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/Phone Screen-checkpoint.ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/Phone Screen-checkpoint.ipynb deleted file mode 100644 index 8edb0203..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/.ipynb_checkpoints/Phone Screen-checkpoint.ipynb +++ /dev/null @@ -1,80 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen\n", - "\n", - "**This phone screen will consist of a non-technical series of questions about you and the company, and then a second half of a simple technical question to be coded out**\n", - "___\n", - "## Non-Technical Questions\n", - "\n", - "**Answer the following questions (2-5 minute responses) technical answers not required, more interested in hearing about your reasoning**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* Give me some quick background about you (go over your resume)\n", - "* Why do you want to work here?\n", - "* What's your favorite programming language and why?\n", - "* Where do you see yourself in 5 years?\n", - "* Do you have any questions about the company for me?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___\n", - "## Technical Questions\n", - "\n", - "**Answer the following question in the *Markdown* cell below. It's important to note that the cell below does NOT have syntax highlighting, its common in a phone screen interview to be given a text editor hich doesn't have anything more than basic text support**\n", - "\n", - "1. Write a function that computes the Nth fibonacci number" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 1 .ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 1 .ipynb deleted file mode 100644 index c4514711..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 1 .ipynb +++ /dev/null @@ -1,54 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 \n", - "___\n", - "\n", - "## Question\n", - "** Given a dice which rolls 1 to 7 (with uniform probability), simulate a 5 sided dice. Preferably, write your solution as a function. **\n", - "\n", - "## Requirements\n", - "\n", - "** You MUST do this on pen and paper or on a whiteboard. No actual coding is allowed until you've solved it on pen and paper! **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 2 .ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 2 .ipynb deleted file mode 100644 index a63ca005..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 2 .ipynb +++ /dev/null @@ -1,54 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 \n", - "___\n", - "\n", - "## Question\n", - "** Given a dice which rolls from 1 to 5, simulate a uniform 7 sided dice! **\n", - "\n", - "## Requirements\n", - "\n", - "** You MUST do this on pen and paper or on a whiteboard. No actual coding is allowed until you've come up with a solution by hand! **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 3 .ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 3 .ipynb deleted file mode 100644 index 49a04c0d..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 3 .ipynb +++ /dev/null @@ -1,54 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 \n", - "\n", - "## Question\n", - "\n", - "**Given a string, write a function that uses recursion to reverse it. **\n", - "\n", - "## Requirements\n", - "\n", - "** You MUST use pen and paper or a whiteboard to answer this, no coding allowed! **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 4 .ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 4 .ipynb deleted file mode 100644 index d69bf130..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/On-Site Question 4 .ipynb +++ /dev/null @@ -1,46 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 4 \n", - "\n", - "## Question\n", - "**Find the squareroot of a given number rounded down to the nearest integer, without using the sqrt function. For example, squareroot of a number between [9, 15] should return 3, and [16, 24] should be 4.**\n", - "\n", - "## Requirements\n", - "\n", - "** Feel free to code this out (but its recommended that you use paper/pencil or whiteboard)**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/Phone Screen.ipynb b/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/Phone Screen.ipynb deleted file mode 100644 index 8edb0203..00000000 --- a/Mock Interviews/Large Search Engine Company /Search Engine Company - Interview Problems/Phone Screen.ipynb +++ /dev/null @@ -1,80 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen\n", - "\n", - "**This phone screen will consist of a non-technical series of questions about you and the company, and then a second half of a simple technical question to be coded out**\n", - "___\n", - "## Non-Technical Questions\n", - "\n", - "**Answer the following questions (2-5 minute responses) technical answers not required, more interested in hearing about your reasoning**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* Give me some quick background about you (go over your resume)\n", - "* Why do you want to work here?\n", - "* What's your favorite programming language and why?\n", - "* Where do you see yourself in 5 years?\n", - "* Do you have any questions about the company for me?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "___\n", - "## Technical Questions\n", - "\n", - "**Answer the following question in the *Markdown* cell below. It's important to note that the cell below does NOT have syntax highlighting, its common in a phone screen interview to be given a text editor hich doesn't have anything more than basic text support**\n", - "\n", - "1. Write a function that computes the Nth fibonacci number" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index a471b4b1..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,149 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers, find the largest product you could make from 3 integers in the list **\n", - "\n", - "## Requirements\n", - "\n", - "** You can assume that the list will always have at least 3 integers **\n", - "\n", - "** Paper/pencil only, don't code this out until you've solved it as far as you can by hand. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "We can solve this problem in O(n) time with O(1) space, we should also be able to take into account negative numbers, so that a list like: [-5,-5,1,3] returns (-5)(-5)(3) = 75 as its answer.\n", - "\n", - "Hopefully you've begun to realize the similarity between this problem and the Amazon stock problem from the E-Commerce Company mock interview questions! You could brute force this problem by just simply trying every single combination of three digits, but this would require O(n^3) time!\n", - "\n", - "How about we use a greedy approach and keep track of some numbers. In the stock problem we kept track of max profit so far, in this problem we are actually going to keep track of several numbers:\n", - "\n", - "* The highest product of 3 numbers so far\n", - "* The highest product of 2 numbers so far\n", - "* The highest number so far\n", - "\n", - "Since we want to keep negative numbers in account, we will also keep track of the lowest product of two and the lowest number:\n", - "\n", - "* The lowest product of 2\n", - "* The lowest number\n", - "\n", - "Once we iterate through the list and reach the end we will have the highest posiible product with 3 numbers. At each iteration we will take the current highest product of 3 and compare it to the current integer multiplied by the highest and lowest products of 2.\n", - "\n", - "Let's see this coded out:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(lst):\n", - " \n", - " # Start at index 2 (3rd element) and assign highest and lowest \n", - " # based off of first two elements\n", - " \n", - " # Highest Number so far\n", - " high = max(lst[0],lst[1])\n", - " \n", - " # Lowest number so far\n", - " low = min(lst[0],lst[1])\n", - " \n", - " # Initiate Highest and lowest products of two numbers\n", - " high_prod2 = lst[0]*lst[1]\n", - " low_prod2 = lst[0]*lst[1]\n", - " \n", - " # Initiate highest product of 3 numbers\n", - " high_prod3 = lst[0]*lst[1]*lst[2]\n", - " \n", - " # Iterate through list\n", - " for num in lst[2:]:\n", - " \n", - " # Compare possible highest product of 3 numbers\n", - " high_prod3 = max(high_prod3,num*high_prod2,num*low_prod2)\n", - " \n", - " \n", - " # Check for possible new highest products of 2 numbers\n", - " high_prod2 = max(high_prod2,num*high,num*low)\n", - " \n", - " # Check for possible new lowest products of 2 numbers\n", - " low_prod2 = min(low_prod2,num*high,num*low)\n", - " \n", - " # Check for new possible high\n", - " high = max(high,num)\n", - " \n", - " # Check for new possible low\n", - " low = min(low,num)\n", - " \n", - " return high_prod3" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "763092" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "l = [99,-82,82,40,75,-24,39, -82, 5, 30, -25, -94, 93, -23, 48, 50, 49,-81,41,63]\n", - "\n", - "solution(l)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great! Through the use of a greedy approach we have been able to complete the problem in O(n) time. Keep this sort of approach in mind when you have to iterate through a list and a brute force solution is on the order of an exponential!\n", - "\n", - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 0c613795..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,115 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Write a function that given a target amount of money and a list of possible coin denominations, returns the number of ways to make change for the target amount using the coin denominations**\n", - "\n", - "## Requirements\n", - "\n", - "** Write out your work on paper/pencil, then see if you can code up your solution **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "This is a classic interview problem, so classic that you've already seen a very similar problem in the recursion section! Make sure to review that problem first before reading our solution here!\n", - "\n", - "In this solution we will use a [bottom-up](https://en.wikipedia.org/wiki/Top-down_and_bottom-up_design) algorithm.\n", - "\n", - "* As we iterate through each coin, we are adding the ways of making arr[i - coin] to arr[i]\n", - "* If we have 2 ways of making 4, and are now iterating on a coin of value 3, there should be 2 ways of making 7.\n", - "* We are essentially adding the coin we are iterating on to the number of ways of making arr[i]." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(n, coins):\n", - " \n", - " # Set up our array for trakcing results\n", - " arr = [1] + [0] * n\n", - " \n", - " for coin in coins:\n", - " for i in range(coin, n + 1):\n", - " arr[i] += arr[i - coin]\n", - " \n", - " if n == 0:\n", - " return 0\n", - " else:\n", - " return arr[n]\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "884" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution(100, [1, 2, 3])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This solution results in O((m)(n)) with m being the number of coins, where we iterate about n operations. This is O(n) space." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 238cc667..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,121 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a binary tree, check whether it’s a binary search tree or not. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Requirements\n", - "\n", - "** Use paper/pencil, do not code this in an IDE until you've done it manually**\n", - "\n", - "** Do not use built-in Python libraries to do this, but do mention them if you know about them **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "The first solution that comes to mind is, at every node check whether its value is larger than or equal to its left child and smaller than or equal to its right child (assuming equals can appear at either left or right). However, this approach is erroneous because it doesn’t check whether a node violates any condition with its grandparent or any of its ancestors. \n", - "\n", - "So, we should keep track of the minimum and maximum values a node can take. And at each node we will check whether its value is between the min and max values it’s allowed to take. The root can take any value between negative infinity and positive infinity. At any node, its left child should be smaller than or equal than its own value, and similarly the right child should be larger than or equal to. So during recursion, we send the current value as the new max to our left child and send the min as it is without changing. And to the right child, we send the current value as the new min and send the max without changing. " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "class Node: \n", - " def __init__(self, val=None): \n", - " self.left, self.right, self.val = None, None, val \n", - " \n", - "INFINITY = float(\"infinity\") \n", - "NEG_INFINITY = float(\"-infinity\") \n", - "\n", - "def isBST(tree, minVal=NEG_INFINITY, maxVal=INFINITY): \n", - " if tree is None:\n", - " return True \n", - " if not minVal <= tree.val <= maxVal: \n", - " return False \n", - " \n", - " return isBST(tree.left, minVal, tree.val) and isBST(tree.right, tree.val, maxVal) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There’s an equally good alternative solution. If a tree is a binary search tree, then traversing the tree inorder should lead to sorted order of the values in the tree. So, we can perform an inorder traversal and check whether the node values are sorted or not." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def isBST2(tree, lastNode=[NEG_INFINITY]): \n", - " \n", - " if tree is None: \n", - " return True \n", - " \n", - " if not isBST2(tree.left, lastNode):\n", - " return False \n", - " \n", - " if tree.val < lastNode[0]: \n", - " return False \n", - " \n", - " lastNode[0]=tree.val \n", - " \n", - " return isBST2(tree.right, lastNode) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is a common interview problem, its relatively simple, but not trivial and shows that someone has a knowledge of binary search trees and tree traversals.\n", - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 662e8373..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,53 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** If you were given a list of n integers and knew that they were sorted, how quickly could you check if a given integer was in the list? Elaborate on your reasoning and search methods in general**\n", - "\n", - "## Requirements\n", - "\n", - "** Try explaining your solution to someone and see if it makes sense ot them. Don't code anything for this problem **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "Hopefully this problem sounds familiar! We can use a binary search to search for an intger since the list is already sorted! This means we can find the item in [O(logn) time and O(1) space](http://bigocheatsheet.com/)!\n", - "\n", - "Revisit the lectures on Binary Search and its implementation to fully get the reasoning behind this solution and problem!\n", - "\n", - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb deleted file mode 100644 index a471b4b1..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb +++ /dev/null @@ -1,149 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers, find the largest product you could make from 3 integers in the list **\n", - "\n", - "## Requirements\n", - "\n", - "** You can assume that the list will always have at least 3 integers **\n", - "\n", - "** Paper/pencil only, don't code this out until you've solved it as far as you can by hand. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "We can solve this problem in O(n) time with O(1) space, we should also be able to take into account negative numbers, so that a list like: [-5,-5,1,3] returns (-5)(-5)(3) = 75 as its answer.\n", - "\n", - "Hopefully you've begun to realize the similarity between this problem and the Amazon stock problem from the E-Commerce Company mock interview questions! You could brute force this problem by just simply trying every single combination of three digits, but this would require O(n^3) time!\n", - "\n", - "How about we use a greedy approach and keep track of some numbers. In the stock problem we kept track of max profit so far, in this problem we are actually going to keep track of several numbers:\n", - "\n", - "* The highest product of 3 numbers so far\n", - "* The highest product of 2 numbers so far\n", - "* The highest number so far\n", - "\n", - "Since we want to keep negative numbers in account, we will also keep track of the lowest product of two and the lowest number:\n", - "\n", - "* The lowest product of 2\n", - "* The lowest number\n", - "\n", - "Once we iterate through the list and reach the end we will have the highest posiible product with 3 numbers. At each iteration we will take the current highest product of 3 and compare it to the current integer multiplied by the highest and lowest products of 2.\n", - "\n", - "Let's see this coded out:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(lst):\n", - " \n", - " # Start at index 2 (3rd element) and assign highest and lowest \n", - " # based off of first two elements\n", - " \n", - " # Highest Number so far\n", - " high = max(lst[0],lst[1])\n", - " \n", - " # Lowest number so far\n", - " low = min(lst[0],lst[1])\n", - " \n", - " # Initiate Highest and lowest products of two numbers\n", - " high_prod2 = lst[0]*lst[1]\n", - " low_prod2 = lst[0]*lst[1]\n", - " \n", - " # Initiate highest product of 3 numbers\n", - " high_prod3 = lst[0]*lst[1]*lst[2]\n", - " \n", - " # Iterate through list\n", - " for num in lst[2:]:\n", - " \n", - " # Compare possible highest product of 3 numbers\n", - " high_prod3 = max(high_prod3,num*high_prod2,num*low_prod2)\n", - " \n", - " \n", - " # Check for possible new highest products of 2 numbers\n", - " high_prod2 = max(high_prod2,num*high,num*low)\n", - " \n", - " # Check for possible new lowest products of 2 numbers\n", - " low_prod2 = min(low_prod2,num*high,num*low)\n", - " \n", - " # Check for new possible high\n", - " high = max(high,num)\n", - " \n", - " # Check for new possible low\n", - " low = min(low,num)\n", - " \n", - " return high_prod3" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "763092" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "l = [99,-82,82,40,75,-24,39, -82, 5, 30, -25, -94, 93, -23, 48, 50, 49,-81,41,63]\n", - "\n", - "solution(l)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great! Through the use of a greedy approach we have been able to complete the problem in O(n) time. Keep this sort of approach in mind when you have to iterate through a list and a brute force solution is on the order of an exponential!\n", - "\n", - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb deleted file mode 100644 index 0c613795..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb +++ /dev/null @@ -1,115 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Write a function that given a target amount of money and a list of possible coin denominations, returns the number of ways to make change for the target amount using the coin denominations**\n", - "\n", - "## Requirements\n", - "\n", - "** Write out your work on paper/pencil, then see if you can code up your solution **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "This is a classic interview problem, so classic that you've already seen a very similar problem in the recursion section! Make sure to review that problem first before reading our solution here!\n", - "\n", - "In this solution we will use a [bottom-up](https://en.wikipedia.org/wiki/Top-down_and_bottom-up_design) algorithm.\n", - "\n", - "* As we iterate through each coin, we are adding the ways of making arr[i - coin] to arr[i]\n", - "* If we have 2 ways of making 4, and are now iterating on a coin of value 3, there should be 2 ways of making 7.\n", - "* We are essentially adding the coin we are iterating on to the number of ways of making arr[i]." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(n, coins):\n", - " \n", - " # Set up our array for trakcing results\n", - " arr = [1] + [0] * n\n", - " \n", - " for coin in coins:\n", - " for i in range(coin, n + 1):\n", - " arr[i] += arr[i - coin]\n", - " \n", - " if n == 0:\n", - " return 0\n", - " else:\n", - " return arr[n]\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "884" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution(100, [1, 2, 3])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This solution results in O((m)(n)) with m being the number of coins, where we iterate about n operations. This is O(n) space." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb deleted file mode 100644 index 238cc667..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb +++ /dev/null @@ -1,121 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a binary tree, check whether it’s a binary search tree or not. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Requirements\n", - "\n", - "** Use paper/pencil, do not code this in an IDE until you've done it manually**\n", - "\n", - "** Do not use built-in Python libraries to do this, but do mention them if you know about them **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "The first solution that comes to mind is, at every node check whether its value is larger than or equal to its left child and smaller than or equal to its right child (assuming equals can appear at either left or right). However, this approach is erroneous because it doesn’t check whether a node violates any condition with its grandparent or any of its ancestors. \n", - "\n", - "So, we should keep track of the minimum and maximum values a node can take. And at each node we will check whether its value is between the min and max values it’s allowed to take. The root can take any value between negative infinity and positive infinity. At any node, its left child should be smaller than or equal than its own value, and similarly the right child should be larger than or equal to. So during recursion, we send the current value as the new max to our left child and send the min as it is without changing. And to the right child, we send the current value as the new min and send the max without changing. " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "class Node: \n", - " def __init__(self, val=None): \n", - " self.left, self.right, self.val = None, None, val \n", - " \n", - "INFINITY = float(\"infinity\") \n", - "NEG_INFINITY = float(\"-infinity\") \n", - "\n", - "def isBST(tree, minVal=NEG_INFINITY, maxVal=INFINITY): \n", - " if tree is None:\n", - " return True \n", - " if not minVal <= tree.val <= maxVal: \n", - " return False \n", - " \n", - " return isBST(tree.left, minVal, tree.val) and isBST(tree.right, tree.val, maxVal) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There’s an equally good alternative solution. If a tree is a binary search tree, then traversing the tree inorder should lead to sorted order of the values in the tree. So, we can perform an inorder traversal and check whether the node values are sorted or not." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def isBST2(tree, lastNode=[NEG_INFINITY]): \n", - " \n", - " if tree is None: \n", - " return True \n", - " \n", - " if not isBST2(tree.left, lastNode):\n", - " return False \n", - " \n", - " if tree.val < lastNode[0]: \n", - " return False \n", - " \n", - " lastNode[0]=tree.val \n", - " \n", - " return isBST2(tree.right, lastNode) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is a common interview problem, its relatively simple, but not trivial and shows that someone has a knowledge of binary search trees and tree traversals.\n", - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/Phone Screen - SOLUTION.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/Phone Screen - SOLUTION.ipynb deleted file mode 100644 index 662e8373..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions - SOLUTIONS/Phone Screen - SOLUTION.ipynb +++ /dev/null @@ -1,53 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** If you were given a list of n integers and knew that they were sorted, how quickly could you check if a given integer was in the list? Elaborate on your reasoning and search methods in general**\n", - "\n", - "## Requirements\n", - "\n", - "** Try explaining your solution to someone and see if it makes sense ot them. Don't code anything for this problem **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "Hopefully this problem sounds familiar! We can use a binary search to search for an intger since the list is already sorted! This means we can find the item in [O(logn) time and O(1) space](http://bigocheatsheet.com/)!\n", - "\n", - "Revisit the lectures on Binary Search and its implementation to fully get the reasoning behind this solution and problem!\n", - "\n", - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb deleted file mode 100644 index ccfa72f7..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 1 -checkpoint.ipynb +++ /dev/null @@ -1,49 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 \n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers, find the largest product you could make from 3 integers in the list **\n", - "\n", - "## Requirements\n", - "\n", - "** You can assume that the list will always have at least 3 integers **\n", - "\n", - "** Paper/pencil only, don't code this out until you've solved it as far as you can by hand. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb deleted file mode 100644 index cd47095c..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 2 -checkpoint.ipynb +++ /dev/null @@ -1,47 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 \n", - "\n", - "## Problem\n", - "\n", - "** Write a function that given a target amount of money and a list of possible coin denominations, returns the number of ways to make change for the target amount using the coin denominations**\n", - "\n", - "## Requirements\n", - "\n", - "** Write out your work on paper/pencil, then see if you can code up your solution **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb deleted file mode 100644 index 380ec415..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/On-Site Question 3 -checkpoint.ipynb +++ /dev/null @@ -1,54 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 \n", - "\n", - "## Problem\n", - "\n", - "** Given a binary tree, check whether it’s a binary search tree or not. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Requirements\n", - "\n", - "** Use paper/pencil, do not code this in an IDE until you've done it manually**\n", - "\n", - "** Do not use built-in Python libraries to do this, but do mention them if you know about them **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/Phone Screen -checkpoint.ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/Phone Screen -checkpoint.ipynb deleted file mode 100644 index 062944af..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /.ipynb_checkpoints/Phone Screen -checkpoint.ipynb +++ /dev/null @@ -1,47 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen \n", - "\n", - "## Problem\n", - "\n", - "** If you were given a list of n integers and knew that they were sorted, how quickly could you check if a given integer was in the list? Elaborate on your reasoning and search methods in general**\n", - "\n", - "## Requirements\n", - "\n", - "** Try explaining your solution to someone and see if it makes sense ot them. Don't code anything for this problem **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 1 .ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 1 .ipynb deleted file mode 100644 index ccfa72f7..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 1 .ipynb +++ /dev/null @@ -1,49 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 \n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers, find the largest product you could make from 3 integers in the list **\n", - "\n", - "## Requirements\n", - "\n", - "** You can assume that the list will always have at least 3 integers **\n", - "\n", - "** Paper/pencil only, don't code this out until you've solved it as far as you can by hand. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 2 .ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 2 .ipynb deleted file mode 100644 index cd47095c..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 2 .ipynb +++ /dev/null @@ -1,47 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 \n", - "\n", - "## Problem\n", - "\n", - "** Write a function that given a target amount of money and a list of possible coin denominations, returns the number of ways to make change for the target amount using the coin denominations**\n", - "\n", - "## Requirements\n", - "\n", - "** Write out your work on paper/pencil, then see if you can code up your solution **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 3 .ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 3 .ipynb deleted file mode 100644 index 380ec415..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /On-Site Question 3 .ipynb +++ /dev/null @@ -1,54 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 \n", - "\n", - "## Problem\n", - "\n", - "** Given a binary tree, check whether it’s a binary search tree or not. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Requirements\n", - "\n", - "** Use paper/pencil, do not code this in an IDE until you've done it manually**\n", - "\n", - "** Do not use built-in Python libraries to do this, but do mention them if you know about them **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /Phone Screen .ipynb b/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /Phone Screen .ipynb deleted file mode 100644 index 062944af..00000000 --- a/Mock Interviews/Ride Share Start-Up Company/Ride Share Company - Interview Questions /Phone Screen .ipynb +++ /dev/null @@ -1,47 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen \n", - "\n", - "## Problem\n", - "\n", - "** If you were given a list of n integers and knew that they were sorted, how quickly could you check if a given integer was in the list? Elaborate on your reasoning and search methods in general**\n", - "\n", - "## Requirements\n", - "\n", - "** Try explaining your solution to someone and see if it makes sense ot them. Don't code anything for this problem **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index f00525dd..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 1 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,138 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers and a target number, write a function that returns a boolean indicating if its possible to sum two integers from the list to reach the target number **\n", - "\n", - "## Requirements\n", - "\n", - "** Try pen/paper before coding out your solution **\n", - "\n", - "** You can not use an integer element twice. Optimize for time over space **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "For this problem we will take advantage of a **set** data structure. We will make a single pass through the list of integers, treating each element as the first integer of our possible sum.\n", - "\n", - "At each iteration we will check to see if there is a second integer which will allow us hit the target number, adn we will use a set to check if we've already seen it in our list.\n", - "\n", - "We will then update our seen set by adding the current number in the iteration to it.\n", - "\n", - "Let's see this coded out:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(lst,target):\n", - " \n", - " # Create set to keep track of duplicates\n", - " seen = set()\n", - " \n", - " # We want to find if there is a num2 that sums with num to reach the target\n", - " \n", - " for num in lst:\n", - " \n", - " num2 = target - num\n", - " \n", - " if num2 in seen:\n", - " return True\n", - " \n", - " seen.add(num)\n", - " \n", - " # If we never find a pair match which creates the sum\n", - " return False" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution([1,3,5,1,7],4)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution([1,3,5,1,7],14)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 7d049b8a..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 2 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,86 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a list of account ID numbers (integers) which contains duplicates , find the one unique integer. (the list is guaranteed to only have one unique (non-duplicated) integer **\n", - "\n", - "## Requirements\n", - "\n", - "** Do not use built-in Python functions or methods **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "This should feel very familiar to one of the problems we did in the array section of the course! We can use an [XOR](https://en.wikipedia.org/wiki/Exclusive_or) operation. The **exclusive or** operations will take two sets of bits and for each pair it will return a 1 value if **one but not both** of the bits is 1.\n", - "\n", - "In Python we can use the ^ symbol to perform an XOR.\n", - "\n", - "Now for our solution we can simply XOR all the integers in the list. We start with a unique id set to 0, then every time we XOR a new id from the list, it will change the bits. When we XOR with the same ID again, it will cancel out the earlier change.\n", - "\n", - "By the end, we wil be left with the ID that was unique and only appeared once!" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(id_list):\n", - " \n", - " # Initiate unique Id\n", - " unique_id = 0\n", - " \n", - " # XOR fo revery id in id list\n", - " for i in id_list:\n", - " \n", - " # XOR operation\n", - " unique_id ^= i\n", - " \n", - " return unique_id" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb deleted file mode 100644 index 62cbf2b9..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/On-Site Question 3 - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,116 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Create a function that takes in a list of unsorted prices (integers) and a maximum possible price value, and return a sorted list of prices**\n", - "\n", - "## Requirements\n", - "\n", - "** Your function should be able to perform this in less than O(nlogn) time. **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "We can actually solve this problem by using a [*counting sort*](https://en.wikipedia.org/wiki/Counting_sort). Basically a counting sort works well when you know the range of integer values you will have ahead of time.\n", - "\n", - "Read the wikipedia article linked above for a full break down, and an implementation is here below (using the prices situation described in the problem above)." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(unsorted_prices,max_price):\n", - " \n", - " # list of 0s at indices 0 to max_price\n", - " prices_to_counts = [0]* (max_price+1)\n", - " \n", - " # populate prices\n", - " for price in unsorted_prices:\n", - " prices_to_counts[price] +=1\n", - " \n", - " # populate final sorted prices\n", - " sorted_prices = []\n", - " \n", - " # For each price in prices_to_counts\n", - " for price,count in enumerate(prices_to_counts):\n", - " \n", - " # for the number of times the element occurs\n", - " for time in range(count):\n", - " \n", - " # add it to the sorted price list\n", - " sorted_prices.append(price)\n", - " \n", - " return sorted_prices" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[2, 3, 4, 6, 7, 8, 9]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution([4,6,2,7,3,8,9],9)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This was a great exercise in learning about a new sorting algorithm, make sure to read up on it and practice this problem again!\n", - "\n", - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb deleted file mode 100644 index fe61bd16..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/.ipynb_checkpoints/Phone Screen - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,87 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen - SOLUTION\n", - "\n", - "## Problem \n", - "\n", - "** Remove duplicate characters in a given string keeping only the first occurrences. For example, if the input is ‘tree traversal’ the output will be ‘tre avsl’. **\n", - "\n", - "## Requirements\n", - "\n", - "**Complete this problem on a text editor that does not have syntax highlighting, such as a goolge doc!**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "We need a data structure to keep track of the characters we have seen so far, which can perform efficient find operation. If the input is guaranteed to be in standard ASCII form, we can just create a boolean array of size 128 and perform lookups by accessing the index of the character’s ASCII value in constant time. But if the string is Unicode then we would need a much larger array of size more than 100K, which will be a waste since most of it would generally be unused.\n", - "\n", - "Set data structure perfectly suits our purpose. It stores keys and provides constant time search for key existence. So, we’ll loop over the characters of the string, and at each iteration we’ll check whether we have seen the current character before by searching the set. If it’s in the set then it means we’ve seen it before, so we ignore it. Otherwise, we include it in the result and add it to the set to keep track for future reference. The code is easier to understand:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def removeDuplicates(string): \n", - " result=[] \n", - " seen=set() \n", - " \n", - " for char in string: \n", - " if char not in seen: \n", - " seen.add(char) \n", - " result.append(char)\n", - " \n", - " return ''.join(result) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The time complexity of the algorithm is O(N) where N is the number of characters in the input string, because set supports O(1) insert and find. This is an optimal solution to one of the most common string interview questions. \n", - "\n", - "This problem should have felt very similar to some other array questions you've been asked! Remember that many basic interview question ideas overlap, just their presentation is different!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb deleted file mode 100644 index f00525dd..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 1 - SOLUTION.ipynb +++ /dev/null @@ -1,138 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers and a target number, write a function that returns a boolean indicating if its possible to sum two integers from the list to reach the target number **\n", - "\n", - "## Requirements\n", - "\n", - "** Try pen/paper before coding out your solution **\n", - "\n", - "** You can not use an integer element twice. Optimize for time over space **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "For this problem we will take advantage of a **set** data structure. We will make a single pass through the list of integers, treating each element as the first integer of our possible sum.\n", - "\n", - "At each iteration we will check to see if there is a second integer which will allow us hit the target number, adn we will use a set to check if we've already seen it in our list.\n", - "\n", - "We will then update our seen set by adding the current number in the iteration to it.\n", - "\n", - "Let's see this coded out:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(lst,target):\n", - " \n", - " # Create set to keep track of duplicates\n", - " seen = set()\n", - " \n", - " # We want to find if there is a num2 that sums with num to reach the target\n", - " \n", - " for num in lst:\n", - " \n", - " num2 = target - num\n", - " \n", - " if num2 in seen:\n", - " return True\n", - " \n", - " seen.add(num)\n", - " \n", - " # If we never find a pair match which creates the sum\n", - " return False" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution([1,3,5,1,7],4)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution([1,3,5,1,7],14)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb deleted file mode 100644 index 7d049b8a..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 2 - SOLUTION.ipynb +++ /dev/null @@ -1,86 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Given a list of account ID numbers (integers) which contains duplicates , find the one unique integer. (the list is guaranteed to only have one unique (non-duplicated) integer **\n", - "\n", - "## Requirements\n", - "\n", - "** Do not use built-in Python functions or methods **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "This should feel very familiar to one of the problems we did in the array section of the course! We can use an [XOR](https://en.wikipedia.org/wiki/Exclusive_or) operation. The **exclusive or** operations will take two sets of bits and for each pair it will return a 1 value if **one but not both** of the bits is 1.\n", - "\n", - "In Python we can use the ^ symbol to perform an XOR.\n", - "\n", - "Now for our solution we can simply XOR all the integers in the list. We start with a unique id set to 0, then every time we XOR a new id from the list, it will change the bits. When we XOR with the same ID again, it will cancel out the earlier change.\n", - "\n", - "By the end, we wil be left with the ID that was unique and only appeared once!" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(id_list):\n", - " \n", - " # Initiate unique Id\n", - " unique_id = 0\n", - " \n", - " # XOR fo revery id in id list\n", - " for i in id_list:\n", - " \n", - " # XOR operation\n", - " unique_id ^= i\n", - " \n", - " return unique_id" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb deleted file mode 100644 index 62cbf2b9..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/On-Site Question 3 - SOLUTION.ipynb +++ /dev/null @@ -1,116 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 - SOLUTION\n", - "\n", - "## Problem\n", - "\n", - "** Create a function that takes in a list of unsorted prices (integers) and a maximum possible price value, and return a sorted list of prices**\n", - "\n", - "## Requirements\n", - "\n", - "** Your function should be able to perform this in less than O(nlogn) time. **" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## Solution\n", - "\n", - "We can actually solve this problem by using a [*counting sort*](https://en.wikipedia.org/wiki/Counting_sort). Basically a counting sort works well when you know the range of integer values you will have ahead of time.\n", - "\n", - "Read the wikipedia article linked above for a full break down, and an implementation is here below (using the prices situation described in the problem above)." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def solution(unsorted_prices,max_price):\n", - " \n", - " # list of 0s at indices 0 to max_price\n", - " prices_to_counts = [0]* (max_price+1)\n", - " \n", - " # populate prices\n", - " for price in unsorted_prices:\n", - " prices_to_counts[price] +=1\n", - " \n", - " # populate final sorted prices\n", - " sorted_prices = []\n", - " \n", - " # For each price in prices_to_counts\n", - " for price,count in enumerate(prices_to_counts):\n", - " \n", - " # for the number of times the element occurs\n", - " for time in range(count):\n", - " \n", - " # add it to the sorted price list\n", - " sorted_prices.append(price)\n", - " \n", - " return sorted_prices" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[2, 3, 4, 6, 7, 8, 9]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution([4,6,2,7,3,8,9],9)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This was a great exercise in learning about a new sorting algorithm, make sure to read up on it and practice this problem again!\n", - "\n", - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/Phone Screen - SOLUTION.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/Phone Screen - SOLUTION.ipynb deleted file mode 100644 index fe61bd16..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions - SOLUTIONS/Phone Screen - SOLUTION.ipynb +++ /dev/null @@ -1,87 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen - SOLUTION\n", - "\n", - "## Problem \n", - "\n", - "** Remove duplicate characters in a given string keeping only the first occurrences. For example, if the input is ‘tree traversal’ the output will be ‘tre avsl’. **\n", - "\n", - "## Requirements\n", - "\n", - "**Complete this problem on a text editor that does not have syntax highlighting, such as a goolge doc!**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "We need a data structure to keep track of the characters we have seen so far, which can perform efficient find operation. If the input is guaranteed to be in standard ASCII form, we can just create a boolean array of size 128 and perform lookups by accessing the index of the character’s ASCII value in constant time. But if the string is Unicode then we would need a much larger array of size more than 100K, which will be a waste since most of it would generally be unused.\n", - "\n", - "Set data structure perfectly suits our purpose. It stores keys and provides constant time search for key existence. So, we’ll loop over the characters of the string, and at each iteration we’ll check whether we have seen the current character before by searching the set. If it’s in the set then it means we’ve seen it before, so we ignore it. Otherwise, we include it in the result and add it to the set to keep track for future reference. The code is easier to understand:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def removeDuplicates(string): \n", - " result=[] \n", - " seen=set() \n", - " \n", - " for char in string: \n", - " if char not in seen: \n", - " seen.add(char) \n", - " result.append(char)\n", - " \n", - " return ''.join(result) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The time complexity of the algorithm is O(N) where N is the number of characters in the input string, because set supports O(1) insert and find. This is an optimal solution to one of the most common string interview questions. \n", - "\n", - "This problem should have felt very similar to some other array questions you've been asked! Remember that many basic interview question ideas overlap, just their presentation is different!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb deleted file mode 100644 index a72a4672..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 1-checkpoint.ipynb +++ /dev/null @@ -1,49 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 \n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers and a target number, write a function that returns a boolean indicating if its possible to sum two integers from the list to reach the target number **\n", - "\n", - "## Requirements\n", - "\n", - "** Try pen/paper before coding out your solution **\n", - "\n", - "** You can not use an integer element twice. Optimize for time over space **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 2-checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 2-checkpoint.ipynb deleted file mode 100644 index e65f70c4..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 2-checkpoint.ipynb +++ /dev/null @@ -1,47 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 \n", - "\n", - "## Problem\n", - "\n", - "** Given a list of account ID numbers (integers) which contains duplicates , find the one unique integer. (the list is guaranteed to only have one unique (non-duplicated) integer **\n", - "\n", - "## Requirements\n", - "\n", - "** Do not use built-in Python functions or methods **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb deleted file mode 100644 index 139bd6c5..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/On-Site Question 3-checkpoint.ipynb +++ /dev/null @@ -1,47 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 \n", - "\n", - "## Problem\n", - "\n", - "** Create a function that takes in a list of unsorted prices (integers) and a maximum possible price value, and return a sorted list of prices**\n", - "\n", - "## Requirements\n", - "\n", - "** Your function should be able to perform this in less than O(nlogn) time. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/Phone Screen -checkpoint.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/Phone Screen -checkpoint.ipynb deleted file mode 100644 index d082e4e5..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /.ipynb_checkpoints/Phone Screen -checkpoint.ipynb +++ /dev/null @@ -1,47 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen \n", - "\n", - "## Problem \n", - "\n", - "** Remove duplicate characters in a given string keeping only the first occurrences. For example, if the input is ‘tree traversal’ the output will be ‘tre avsl’. **\n", - "\n", - "## Requirements\n", - "\n", - "**Complete this problem on a text editor that does not have syntax highlighting, such as a goolge doc!**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 1.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 1.ipynb deleted file mode 100644 index a72a4672..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 1.ipynb +++ /dev/null @@ -1,49 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 1 \n", - "\n", - "## Problem\n", - "\n", - "** Given a list of integers and a target number, write a function that returns a boolean indicating if its possible to sum two integers from the list to reach the target number **\n", - "\n", - "## Requirements\n", - "\n", - "** Try pen/paper before coding out your solution **\n", - "\n", - "** You can not use an integer element twice. Optimize for time over space **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 2.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 2.ipynb deleted file mode 100644 index e65f70c4..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 2.ipynb +++ /dev/null @@ -1,47 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 2 \n", - "\n", - "## Problem\n", - "\n", - "** Given a list of account ID numbers (integers) which contains duplicates , find the one unique integer. (the list is guaranteed to only have one unique (non-duplicated) integer **\n", - "\n", - "## Requirements\n", - "\n", - "** Do not use built-in Python functions or methods **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 3.ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 3.ipynb deleted file mode 100644 index 139bd6c5..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /On-Site Question 3.ipynb +++ /dev/null @@ -1,47 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On-Site Question 3 \n", - "\n", - "## Problem\n", - "\n", - "** Create a function that takes in a list of unsorted prices (integers) and a maximum possible price value, and return a sorted list of prices**\n", - "\n", - "## Requirements\n", - "\n", - "** Your function should be able to perform this in less than O(nlogn) time. **" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /Phone Screen .ipynb b/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /Phone Screen .ipynb deleted file mode 100644 index d082e4e5..00000000 --- a/Mock Interviews/Social Network Company/Social Network Company - Interview Questions /Phone Screen .ipynb +++ /dev/null @@ -1,47 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Phone Screen \n", - "\n", - "## Problem \n", - "\n", - "** Remove duplicate characters in a given string keeping only the first occurrences. For example, if the input is ‘tree traversal’ the output will be ‘tre avsl’. **\n", - "\n", - "## Requirements\n", - "\n", - "**Complete this problem on a text editor that does not have syntax highlighting, such as a goolge doc!**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Luck!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Reflect Notes.ipynb b/Reflect Notes.ipynb deleted file mode 100644 index 9f226948..00000000 --- a/Reflect Notes.ipynb +++ /dev/null @@ -1,47 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Array\n", - "- Python use reference when slide or extend an array. (Because python uses immutable value for integers and strings)\n", - "## Dynamic Array Implementation\n", - "- The array has an initial size and will expand twice when extending.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\" \".join()\n", - "reversed()\n", - "s.split()\n", - "len(set(s))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of Binary Search-checkpoint.ipynb b/Sorting and Searching/.ipynb_checkpoints/Implementation of Binary Search-checkpoint.ipynb deleted file mode 100644 index aa558014..00000000 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of Binary Search-checkpoint.ipynb +++ /dev/null @@ -1,226 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Binary Search\n", - "\n", - "In this notebook we will just implement two versions of a simple binary search. View the video lecture for a full breakdown!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Binary Search" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def binary_search(arr,ele):\n", - " \n", - " # First and last index values\n", - " first = 0\n", - " last = len(arr) - 1\n", - " \n", - " found = False\n", - " \n", - " \n", - " while first <= last and not found:\n", - " \n", - " mid = (first+last)/2 # or // for Python 3\n", - " \n", - " # Match found\n", - " if arr[mid] == ele:\n", - " found = True\n", - " \n", - " # Set new midpoints up or down depending on comparison\n", - " else:\n", - " # Set down\n", - " if ele < arr[mid]:\n", - " last = mid -1\n", - " # Set up \n", - " else:\n", - " first = mid + 1\n", - " \n", - " return found" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# list must already be sorted!\n", - "arr = [1,2,3,4,5,6,7,8,9,10]" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "binary_search(arr,4)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "binary_search(arr,2.2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Recursive Version of Binary Search" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def rec_bin_search(arr,ele):\n", - " \n", - " # Base Case!\n", - " if len(arr) == 0:\n", - " return False\n", - " \n", - " # Recursive Case\n", - " else:\n", - " \n", - " mid = len(arr)/2\n", - " \n", - " # If match found\n", - " if arr[mid]==ele:\n", - " return True\n", - " \n", - " else:\n", - " \n", - " # Call again on second half\n", - " if elearr[k+1]:\n", - " temp = arr[k]\n", - " arr[k] = arr[k+1]\n", - " arr[k+1] = temp" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "arr = [3,2,13,4,6,5,7,8,1,20]\n", - "bubble_sort(arr)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 2, 3, 4, 5, 6, 7, 8, 13, 20]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Great Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of Insertion Sort-checkpoint.ipynb b/Sorting and Searching/.ipynb_checkpoints/Implementation of Insertion Sort-checkpoint.ipynb deleted file mode 100644 index 86b90033..00000000 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of Insertion Sort-checkpoint.ipynb +++ /dev/null @@ -1,105 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Insertion Sort\n", - "\n", - "Insertion Sort builds the final sorted array (or list) one item at a time. It is much less efficient on large lists than more advanced algorithms such as quicksort, heapsort, or merge sort. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Resources for Review\n", - "\n", - "Check out the resources below for a review of Insertion sort!\n", - "\n", - "* [Wikipedia](https://en.wikipedia.org/wiki/Insertion_sort)\n", - "* [Visual Algo](http://visualgo.net/sorting.html)\n", - "* [Animation](http://cs.armstrong.edu/liang/animation/web/InsertionSort.html)\n", - "* [Sorting Algorithms Animcation with Pseudocode](http://www.sorting-algorithms.com/insertion-sort)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def insertion_sort(arr):\n", - " \n", - " # For every index in array\n", - " for i in range(1,len(arr)):\n", - " \n", - " # Set current values and position\n", - " currentvalue = arr[i]\n", - " position = i\n", - " \n", - " # Sorted Sublist\n", - " while position>0 and arr[position-1]>currentvalue:\n", - " \n", - " arr[position]=arr[position-1]\n", - " position = position-1\n", - "\n", - " arr[position]=currentvalue" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 2, 3, 4, 5, 6, 8, 12, 25, 41]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr =[3,5,4,6,8,1,2,12,41,25]\n", - "insertion_sort(arr)\n", - "arr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of Merge Sort-checkpoint.ipynb b/Sorting and Searching/.ipynb_checkpoints/Implementation of Merge Sort-checkpoint.ipynb deleted file mode 100644 index 5a38965b..00000000 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of Merge Sort-checkpoint.ipynb +++ /dev/null @@ -1,119 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Merge Sort\n", - "\n", - "Merge sort is a recursive algorithm that continually splits a list in half. If the list is empty or has one item, it is sorted by definition (the base case). If the list has more than one item, we split the list and recursively invoke a merge sort on both halves. Once the two halves are sorted, the fundamental operation, called a merge, is performed. Merging is the process of taking two smaller sorted lists and combining them together into a single, sorted, new list. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Resources for Review\n", - "\n", - "Check out the resources below for a review of Merge sort!\n", - "\n", - "* [Wikipedia](https://en.wikipedia.org/wiki/Merge_sort)\n", - "* [Visual Algo](http://visualgo.net/sorting.html)\n", - "* [Sorting Algorithms Animcation with Pseudocode](http://www.sorting-algorithms.com/merge-sort)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def merge_sort(arr):\n", - " \n", - " if len(arr)>1:\n", - " mid = len(arr)/2\n", - " lefthalf = arr[:mid]\n", - " righthalf = arr[mid:]\n", - "\n", - " merge_sort(lefthalf)\n", - " merge_sort(righthalf)\n", - "\n", - " i=0\n", - " j=0\n", - " k=0\n", - " while i < len(lefthalf) and j < len(righthalf):\n", - " if lefthalf[i] < righthalf[j]:\n", - " arr[k]=lefthalf[i]\n", - " i=i+1\n", - " else:\n", - " arr[k]=righthalf[j]\n", - " j=j+1\n", - " k=k+1\n", - "\n", - " while i < len(lefthalf):\n", - " arr[k]=lefthalf[i]\n", - " i=i+1\n", - " k=k+1\n", - "\n", - " while j < len(righthalf):\n", - " arr[k]=righthalf[j]\n", - " j=j+1\n", - " k=k+1" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 2, 4, 5, 6, 7, 8, 11, 23]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr = [11,2,5,4,7,6,8,1,23]\n", - "merge_sort(arr)\n", - "arr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of Quick Sort-checkpoint.ipynb b/Sorting and Searching/.ipynb_checkpoints/Implementation of Quick Sort-checkpoint.ipynb deleted file mode 100644 index 7a00715a..00000000 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of Quick Sort-checkpoint.ipynb +++ /dev/null @@ -1,132 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Quick Sort\n", - "\n", - "A quick sort first selects a value, which is called the pivot value. Although there are many different ways to choose the pivot value, we will simply use the first item in the list. The role of the pivot value is to assist with splitting the list. The actual position where the pivot value belongs in the final sorted list, commonly called the split point, will be used to divide the list for subsequent calls to the quick sort." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Resources for Review\n", - "\n", - "Check out the resources below for a review of Insertion sort!\n", - "\n", - "* [Wikipedia](https://en.wikipedia.org/wiki/Quicksort)\n", - "* [Visual Algo](http://visualgo.net/sorting.html)\n", - "* [Sorting Algorithms Animcation with Pseudocode](http://www.sorting-algorithms.com/quick-sort)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def quick_sort(arr):\n", - " \n", - " quick_sort_help(arr,0,len(arr)-1)\n", - "\n", - "def quick_sort_help(arr,first,last):\n", - " \n", - " if first= pivotvalue and rightmark >= leftmark:\n", - " rightmark = rightmark -1\n", - "\n", - " if rightmark < leftmark:\n", - " done = True\n", - " else:\n", - " temp = arr[leftmark]\n", - " arr[leftmark] = arr[rightmark]\n", - " arr[rightmark] = temp\n", - "\n", - " temp = arr[first]\n", - " arr[first] = arr[rightmark]\n", - " arr[rightmark] = temp\n", - "\n", - "\n", - " return rightmark" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 2, 3, 4, 4, 5, 6, 7, 11, 12]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr = [2,5,4,6,7,3,1,4,12,11]\n", - "quick_sort(arr)\n", - "arr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of Selection Sort-checkpoint.ipynb b/Sorting and Searching/.ipynb_checkpoints/Implementation of Selection Sort-checkpoint.ipynb deleted file mode 100644 index c6d82a2d..00000000 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of Selection Sort-checkpoint.ipynb +++ /dev/null @@ -1,104 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Selection Sort\n", - "\n", - "The selection sort improves on the bubble sort by making only one exchange for every pass through the list. In order to do this, a selection sort looks for the largest value as it makes a pass and, after completing the pass, places it in the proper location. As with a bubble sort, after the first pass, the largest item is in the correct place. After the second pass, the next largest is in place. This process continues and requires n−1 passes to sort n items, since the final item must be in place after the (n−1) st pass." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Resources for Review\n", - "\n", - "Check out the resources below for a review of Selection sort!\n", - "\n", - "* [Wikipedia](https://en.wikipedia.org/wiki/Selection_sort)\n", - "* [Visual Algo](http://visualgo.net/sorting.html)\n", - "* [Animation](http://cs.armstrong.edu/liang/animation/web/SelectionSort.html)\n", - "* [Sorting Algorithms Animcation with Pseudocode](http://www.sorting-algorithms.com/selection-sort)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def selection_sort(arr):\n", - " \n", - " # For every slot in array\n", - " for fillslot in range(len(arr)-1,0,-1):\n", - " positionOfMax=0\n", - " \n", - " # For every set of 0 to fillslot+1\n", - " for location in range(1,fillslot+1):\n", - " # Set maximum's location\n", - " if arr[location]>arr[positionOfMax]:\n", - " positionOfMax = location\n", - "\n", - " temp = arr[fillslot]\n", - " arr[fillslot] = arr[positionOfMax]\n", - " arr[positionOfMax] = temp" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[2, 3, 5, 6, 7, 8, 12, 21, 40]" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr = [3,5,2,7,6,8,12,40,21]\n", - "selection_sort(arr)\n", - "arr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of Shell Sort-checkpoint.ipynb b/Sorting and Searching/.ipynb_checkpoints/Implementation of Shell Sort-checkpoint.ipynb deleted file mode 100644 index 52bc30fc..00000000 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of Shell Sort-checkpoint.ipynb +++ /dev/null @@ -1,114 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Shell Sort\n", - "\n", - "The shell sort improves on the insertion sort by breaking the original list into a number of smaller sublists, each of which is sorted using an insertion sort. The unique way that these sublists are chosen is the key to the shell sort. Instead of breaking the list into sublists of contiguous items, the shell sort uses an increment i, sometimes called the gap, to create a sublist by choosing all items that are i items apart." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Resources for Review\n", - "\n", - "Check out the resources below for a review of Shell sort!\n", - "\n", - "* [Wikipedia](https://en.wikipedia.org/wiki/Shellsort)\n", - "* [Visual Algo](http://visualgo.net/sorting.html)\n", - "* [Sorting Algorithms Animcation with Pseudocode](http://www.sorting-algorithms.com/shell-sort)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def shell_sort(arr):\n", - " sublistcount = len(arr)/2\n", - " \n", - " # While we still have sub lists\n", - " while sublistcount > 0:\n", - " for start in range(sublistcount):\n", - " # Use a gap insertion\n", - " gap_insertion_sort(arr,start,sublistcount)\n", - "\n", - " \n", - "\n", - " sublistcount = sublistcount / 2\n", - "\n", - "def gap_insertion_sort(arr,start,gap):\n", - " for i in range(start+gap,len(arr),gap):\n", - "\n", - " currentvalue = arr[i]\n", - " position = i\n", - "\n", - " # Using the Gap\n", - " while position>=gap and arr[position-gap]>currentvalue:\n", - " arr[position]=arr[position-gap]\n", - " position = position-gap\n", - " \n", - " # Set current value\n", - " arr[position]=currentvalue" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[2, 4, 6, 7, 21, 23, 24, 45, 45, 67, 90]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr = [45,67,23,45,21,24,7,2,6,4,90]\n", - "shell_sort(arr)\n", - "arr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Sorting and Searching/.ipynb_checkpoints/Implementation of a Hash Table-checkpoint.ipynb b/Sorting and Searching/.ipynb_checkpoints/Implementation of a Hash Table-checkpoint.ipynb deleted file mode 100644 index aa8703ba..00000000 --- a/Sorting and Searching/.ipynb_checkpoints/Implementation of a Hash Table-checkpoint.ipynb +++ /dev/null @@ -1,277 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of a Hash Table\n", - "\n", - "In this lecture we will be implementing our own Hash Table to complete our understanding of Hash Tables and Hash Functions! Make sure to review the video lecture before this to fully understand this implementation!\n", - "\n", - "Keep in mind that Python already has a built-in dictionary object that serves as a Hash Table, you would never actually need to implement your own hash table in Python.\n", - "\n", - "___\n", - "## Map\n", - "The idea of a dictionary used as a hash table to get and retrieve items using **keys** is often referred to as a mapping. In our implementation we will have the following methods:\n", - "\n", - "\n", - "* **HashTable()** Create a new, empty map. It returns an empty map collection.\n", - "* **put(key,val)** Add a new key-value pair to the map. If the key is already in the map then replace the old value with the new value.\n", - "* **get(key)** Given a key, return the value stored in the map or None otherwise.\n", - "* **del** Delete the key-value pair from the map using a statement of the form del map[key].\n", - "* **len()** Return the number of key-value pairs stored \n", - "* **in** the map in Return True for a statement of the form **key in map**, if the given key is in the map, False otherwise." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class HashTable(object):\n", - " \n", - " def __init__(self,size):\n", - " \n", - " # Set up size and slots and data\n", - " self.size = size\n", - " self.slots = [None] * self.size\n", - " self.data = [None] * self.size\n", - " \n", - " def put(self,key,data):\n", - " #Note, we'll only use integer keys for ease of use with the Hash Function\n", - " \n", - " # Get the hash value\n", - " hashvalue = self.hashfunction(key,len(self.slots))\n", - "\n", - " # If Slot is Empty\n", - " if self.slots[hashvalue] == None:\n", - " self.slots[hashvalue] = key\n", - " self.data[hashvalue] = data\n", - " \n", - " else:\n", - " \n", - " # If key already exists, replace old value\n", - " if self.slots[hashvalue] == key:\n", - " self.data[hashvalue] = data \n", - " \n", - " # Otherwise, find the next available slot\n", - " else:\n", - " \n", - " nextslot = self.rehash(hashvalue,len(self.slots))\n", - " \n", - " # Get to the next slot\n", - " while self.slots[nextslot] != None and self.slots[nextslot] != key:\n", - " nextslot = self.rehash(nextslot,len(self.slots))\n", - " \n", - " # Set new key, if NONE\n", - " if self.slots[nextslot] == None:\n", - " self.slots[nextslot]=key\n", - " self.data[nextslot]=data\n", - " \n", - " # Otherwise replace old value\n", - " else:\n", - " self.data[nextslot] = data \n", - "\n", - " def hashfunction(self,key,size):\n", - " # Remainder Method\n", - " return key%size\n", - "\n", - " def rehash(self,oldhash,size):\n", - " # For finding next possible positions\n", - " return (oldhash+1)%size\n", - " \n", - " \n", - " def get(self,key):\n", - " \n", - " # Getting items given a key\n", - " \n", - " # Set up variables for our search\n", - " startslot = self.hashfunction(key,len(self.slots))\n", - " data = None\n", - " stop = False\n", - " found = False\n", - " position = startslot\n", - " \n", - " # Until we discern that its not empty or found (and haven't stopped yet)\n", - " while self.slots[position] != None and not found and not stop:\n", - " \n", - " if self.slots[position] == key:\n", - " found = True\n", - " data = self.data[position]\n", - " \n", - " else:\n", - " position=self.rehash(position,len(self.slots))\n", - " if position == startslot:\n", - " \n", - " stop = True\n", - " return data\n", - "\n", - " # Special Methods for use with Python indexing\n", - " def __getitem__(self,key):\n", - " return self.get(key)\n", - "\n", - " def __setitem__(self,key,data):\n", - " self.put(key,data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's see it in action!" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "h = HashTable(5)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Put our first key in\n", - "h[1] = 'one'" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "h[2] = 'two'" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "h[3] = 'three'" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'one'" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "h[1]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "h[1] = 'new_one'" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'new_one'" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "h[1]" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n" - ] - } - ], - "source": [ - "print h[4]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Great Job!\n", - "\n", - "That's it for this rudimentary implementation, try implementing a different hash function for practice!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Sorting and Searching/.ipynb_checkpoints/Sequential Search-checkpoint.ipynb b/Sorting and Searching/.ipynb_checkpoints/Sequential Search-checkpoint.ipynb deleted file mode 100644 index f514dc75..00000000 --- a/Sorting and Searching/.ipynb_checkpoints/Sequential Search-checkpoint.ipynb +++ /dev/null @@ -1,235 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Sequential Search\n", - "\n", - "Check out the video lecture for a full breakdown, in this Notebook all we do is implement Sequential Search for an Unordered List and an Ordered List." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "## Sequential Search" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def seq_search(arr,ele):\n", - " \"\"\"\n", - " General Sequential Search. Works on Unordered lists.\n", - " \"\"\"\n", - " \n", - " # Start at position 0\n", - " pos = 0\n", - " # Target becomes true if ele is in the list\n", - " found = False\n", - " \n", - " # go until end of list\n", - " while pos < len(arr) and not found:\n", - " \n", - " # If match\n", - " if arr[pos] == ele:\n", - " found = True\n", - " \n", - " # Else move one down\n", - " else:\n", - " pos = pos+1\n", - " \n", - " return found" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "arr = [1,9,2,8,3,4,7,5,6]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], - "source": [ - "print seq_search(arr,1)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "False\n" - ] - } - ], - "source": [ - "print seq_search(arr,10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Ordered List\n", - "\n", - "If we know the list is ordered than, we only have to check until we have found the element or an element greater than it." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def ordered_seq_search(arr,ele):\n", - " \"\"\"\n", - " Sequential search for an Ordered list\n", - " \"\"\"\n", - " # Start at position 0\n", - " pos = 0\n", - " \n", - " # Target becomes true if ele is in the list\n", - " found = False\n", - " \n", - " # Stop marker\n", - " stopped = False\n", - " \n", - " # go until end of list\n", - " while pos < len(arr) and not found and not stopped:\n", - " \n", - " # If match\n", - " if arr[pos] == ele:\n", - " found = True\n", - " \n", - " else:\n", - " \n", - " # Check if element is greater\n", - " if arr[pos] > ele:\n", - " stopped = True\n", - " \n", - " # Otherwise move on\n", - " else:\n", - " pos = pos+1\n", - " \n", - " return found" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "arr.sort() " - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ordered_seq_search(arr,3)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ordered_seq_search(arr,1.5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Sorting and Searching/Implementation of Binary Search.ipynb b/Sorting and Searching/Implementation of Binary Search.ipynb deleted file mode 100644 index aa558014..00000000 --- a/Sorting and Searching/Implementation of Binary Search.ipynb +++ /dev/null @@ -1,226 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Binary Search\n", - "\n", - "In this notebook we will just implement two versions of a simple binary search. View the video lecture for a full breakdown!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Binary Search" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def binary_search(arr,ele):\n", - " \n", - " # First and last index values\n", - " first = 0\n", - " last = len(arr) - 1\n", - " \n", - " found = False\n", - " \n", - " \n", - " while first <= last and not found:\n", - " \n", - " mid = (first+last)/2 # or // for Python 3\n", - " \n", - " # Match found\n", - " if arr[mid] == ele:\n", - " found = True\n", - " \n", - " # Set new midpoints up or down depending on comparison\n", - " else:\n", - " # Set down\n", - " if ele < arr[mid]:\n", - " last = mid -1\n", - " # Set up \n", - " else:\n", - " first = mid + 1\n", - " \n", - " return found" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# list must already be sorted!\n", - "arr = [1,2,3,4,5,6,7,8,9,10]" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "binary_search(arr,4)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "binary_search(arr,2.2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Recursive Version of Binary Search" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def rec_bin_search(arr,ele):\n", - " \n", - " # Base Case!\n", - " if len(arr) == 0:\n", - " return False\n", - " \n", - " # Recursive Case\n", - " else:\n", - " \n", - " mid = len(arr)/2\n", - " \n", - " # If match found\n", - " if arr[mid]==ele:\n", - " return True\n", - " \n", - " else:\n", - " \n", - " # Call again on second half\n", - " if elearr[k+1]:\n", - " temp = arr[k]\n", - " arr[k] = arr[k+1]\n", - " arr[k+1] = temp" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "arr = [3,2,13,4,6,5,7,8,1,20]\n", - "bubble_sort(arr)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 2, 3, 4, 5, 6, 7, 8, 13, 20]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Great Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Sorting and Searching/Implementation of Insertion Sort.ipynb b/Sorting and Searching/Implementation of Insertion Sort.ipynb deleted file mode 100644 index b00bb835..00000000 --- a/Sorting and Searching/Implementation of Insertion Sort.ipynb +++ /dev/null @@ -1,103 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Insertion Sort\n", - "\n", - "Insertion Sort builds the final sorted array (or list) one item at a time. It is much less efficient on large lists than more advanced algorithms such as quicksort, heapsort, or merge sort. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Resources for Review\n", - "\n", - "Check out the resources below for a review of Insertion sort!\n", - "\n", - "* [Wikipedia](https://en.wikipedia.org/wiki/Insertion_sort)\n", - "* [Visual Algo](http://visualgo.net/sorting.html)\n", - "* [Animation](http://cs.armstrong.edu/liang/animation/web/InsertionSort.html)\n", - "* [Sorting Algorithms Animcation with Pseudocode](http://www.sorting-algorithms.com/insertion-sort)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def insertion_sort(arr):\n", - " \n", - " # For every index in array\n", - " for i in range(1,len(arr)):\n", - " \n", - " # Set current values and position\n", - " currentvalue = arr[i]\n", - " position = i\n", - " \n", - " # Sorted Sublist\n", - " while position>0 and arr[position-1]>currentvalue:\n", - " \n", - " arr[position]=arr[position-1]\n", - " position = position-1\n", - "\n", - " arr[position]=currentvalue" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 2, 3, 4, 5, 6, 8, 12, 25, 41]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr =[3,5,4,6,8,1,2,12,41,25]\n", - "insertion_sort(arr)\n", - "arr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Sorting and Searching/Implementation of Merge Sort.ipynb b/Sorting and Searching/Implementation of Merge Sort.ipynb deleted file mode 100644 index 0ad3b17d..00000000 --- a/Sorting and Searching/Implementation of Merge Sort.ipynb +++ /dev/null @@ -1,117 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Merge Sort\n", - "\n", - "Merge sort is a recursive algorithm that continually splits a list in half. If the list is empty or has one item, it is sorted by definition (the base case). If the list has more than one item, we split the list and recursively invoke a merge sort on both halves. Once the two halves are sorted, the fundamental operation, called a merge, is performed. Merging is the process of taking two smaller sorted lists and combining them together into a single, sorted, new list. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Resources for Review\n", - "\n", - "Check out the resources below for a review of Merge sort!\n", - "\n", - "* [Wikipedia](https://en.wikipedia.org/wiki/Merge_sort)\n", - "* [Visual Algo](http://visualgo.net/sorting.html)\n", - "* [Sorting Algorithms Animcation with Pseudocode](http://www.sorting-algorithms.com/merge-sort)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def merge_sort(arr):\n", - " \n", - " if len(arr)>1:\n", - " mid = len(arr)/2\n", - " lefthalf = arr[:mid]\n", - " righthalf = arr[mid:]\n", - "\n", - " merge_sort(lefthalf)\n", - " merge_sort(righthalf)\n", - "\n", - " i=0\n", - " j=0\n", - " k=0\n", - " while i < len(lefthalf) and j < len(righthalf):\n", - " if lefthalf[i] < righthalf[j]:\n", - " arr[k]=lefthalf[i]\n", - " i=i+1\n", - " else:\n", - " arr[k]=righthalf[j]\n", - " j=j+1\n", - " k=k+1\n", - "\n", - " while i < len(lefthalf):\n", - " arr[k]=lefthalf[i]\n", - " i=i+1\n", - " k=k+1\n", - "\n", - " while j < len(righthalf):\n", - " arr[k]=righthalf[j]\n", - " j=j+1\n", - " k=k+1" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 2, 4, 5, 6, 7, 8, 11, 23]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr = [11,2,5,4,7,6,8,1,23]\n", - "merge_sort(arr)\n", - "arr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Sorting and Searching/Implementation of Quick Sort.ipynb b/Sorting and Searching/Implementation of Quick Sort.ipynb deleted file mode 100644 index bf2e99c0..00000000 --- a/Sorting and Searching/Implementation of Quick Sort.ipynb +++ /dev/null @@ -1,130 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Quick Sort\n", - "\n", - "A quick sort first selects a value, which is called the pivot value. Although there are many different ways to choose the pivot value, we will simply use the first item in the list. The role of the pivot value is to assist with splitting the list. The actual position where the pivot value belongs in the final sorted list, commonly called the split point, will be used to divide the list for subsequent calls to the quick sort." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Resources for Review\n", - "\n", - "Check out the resources below for a review of Insertion sort!\n", - "\n", - "* [Wikipedia](https://en.wikipedia.org/wiki/Quicksort)\n", - "* [Visual Algo](http://visualgo.net/sorting.html)\n", - "* [Sorting Algorithms Animcation with Pseudocode](http://www.sorting-algorithms.com/quick-sort)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def quick_sort(arr):\n", - " \n", - " quick_sort_help(arr,0,len(arr)-1)\n", - "\n", - "def quick_sort_help(arr,first,last):\n", - " \n", - " if first= pivotvalue and rightmark >= leftmark:\n", - " rightmark = rightmark -1\n", - "\n", - " if rightmark < leftmark:\n", - " done = True\n", - " else:\n", - " temp = arr[leftmark]\n", - " arr[leftmark] = arr[rightmark]\n", - " arr[rightmark] = temp\n", - "\n", - " temp = arr[first]\n", - " arr[first] = arr[rightmark]\n", - " arr[rightmark] = temp\n", - "\n", - "\n", - " return rightmark" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 2, 3, 4, 4, 5, 6, 7, 11, 12]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr = [2,5,4,6,7,3,1,4,12,11]\n", - "quick_sort(arr)\n", - "arr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Sorting and Searching/Implementation of Selection Sort.ipynb b/Sorting and Searching/Implementation of Selection Sort.ipynb deleted file mode 100644 index c6d82a2d..00000000 --- a/Sorting and Searching/Implementation of Selection Sort.ipynb +++ /dev/null @@ -1,104 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Selection Sort\n", - "\n", - "The selection sort improves on the bubble sort by making only one exchange for every pass through the list. In order to do this, a selection sort looks for the largest value as it makes a pass and, after completing the pass, places it in the proper location. As with a bubble sort, after the first pass, the largest item is in the correct place. After the second pass, the next largest is in place. This process continues and requires n−1 passes to sort n items, since the final item must be in place after the (n−1) st pass." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Resources for Review\n", - "\n", - "Check out the resources below for a review of Selection sort!\n", - "\n", - "* [Wikipedia](https://en.wikipedia.org/wiki/Selection_sort)\n", - "* [Visual Algo](http://visualgo.net/sorting.html)\n", - "* [Animation](http://cs.armstrong.edu/liang/animation/web/SelectionSort.html)\n", - "* [Sorting Algorithms Animcation with Pseudocode](http://www.sorting-algorithms.com/selection-sort)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def selection_sort(arr):\n", - " \n", - " # For every slot in array\n", - " for fillslot in range(len(arr)-1,0,-1):\n", - " positionOfMax=0\n", - " \n", - " # For every set of 0 to fillslot+1\n", - " for location in range(1,fillslot+1):\n", - " # Set maximum's location\n", - " if arr[location]>arr[positionOfMax]:\n", - " positionOfMax = location\n", - "\n", - " temp = arr[fillslot]\n", - " arr[fillslot] = arr[positionOfMax]\n", - " arr[positionOfMax] = temp" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[2, 3, 5, 6, 7, 8, 12, 21, 40]" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr = [3,5,2,7,6,8,12,40,21]\n", - "selection_sort(arr)\n", - "arr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Sorting and Searching/Implementation of Shell Sort.ipynb b/Sorting and Searching/Implementation of Shell Sort.ipynb deleted file mode 100644 index 52bc30fc..00000000 --- a/Sorting and Searching/Implementation of Shell Sort.ipynb +++ /dev/null @@ -1,114 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Shell Sort\n", - "\n", - "The shell sort improves on the insertion sort by breaking the original list into a number of smaller sublists, each of which is sorted using an insertion sort. The unique way that these sublists are chosen is the key to the shell sort. Instead of breaking the list into sublists of contiguous items, the shell sort uses an increment i, sometimes called the gap, to create a sublist by choosing all items that are i items apart." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Resources for Review\n", - "\n", - "Check out the resources below for a review of Shell sort!\n", - "\n", - "* [Wikipedia](https://en.wikipedia.org/wiki/Shellsort)\n", - "* [Visual Algo](http://visualgo.net/sorting.html)\n", - "* [Sorting Algorithms Animcation with Pseudocode](http://www.sorting-algorithms.com/shell-sort)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def shell_sort(arr):\n", - " sublistcount = len(arr)/2\n", - " \n", - " # While we still have sub lists\n", - " while sublistcount > 0:\n", - " for start in range(sublistcount):\n", - " # Use a gap insertion\n", - " gap_insertion_sort(arr,start,sublistcount)\n", - "\n", - " \n", - "\n", - " sublistcount = sublistcount / 2\n", - "\n", - "def gap_insertion_sort(arr,start,gap):\n", - " for i in range(start+gap,len(arr),gap):\n", - "\n", - " currentvalue = arr[i]\n", - " position = i\n", - "\n", - " # Using the Gap\n", - " while position>=gap and arr[position-gap]>currentvalue:\n", - " arr[position]=arr[position-gap]\n", - " position = position-gap\n", - " \n", - " # Set current value\n", - " arr[position]=currentvalue" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[2, 4, 6, 7, 21, 23, 24, 45, 45, 67, 90]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "arr = [45,67,23,45,21,24,7,2,6,4,90]\n", - "shell_sort(arr)\n", - "arr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Sorting and Searching/Implementation of a Hash Table.ipynb b/Sorting and Searching/Implementation of a Hash Table.ipynb deleted file mode 100644 index e71d50a8..00000000 --- a/Sorting and Searching/Implementation of a Hash Table.ipynb +++ /dev/null @@ -1,269 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of a Hash Table\n", - "\n", - "In this lecture we will be implementing our own Hash Table to complete our understanding of Hash Tables and Hash Functions! Make sure to review the video lecture before this to fully understand this implementation!\n", - "\n", - "Keep in mind that Python already has a built-in dictionary object that serves as a Hash Table, you would never actually need to implement your own hash table in Python.\n", - "\n", - "___\n", - "## Map\n", - "The idea of a dictionary used as a hash table to get and retrieve items using **keys** is often referred to as a mapping. In our implementation we will have the following methods:\n", - "\n", - "\n", - "* **HashTable()** Create a new, empty map. It returns an empty map collection.\n", - "* **put(key,val)** Add a new key-value pair to the map. If the key is already in the map then replace the old value with the new value.\n", - "* **get(key)** Given a key, return the value stored in the map or None otherwise.\n", - "* **del** Delete the key-value pair from the map using a statement of the form del map[key].\n", - "* **len()** Return the number of key-value pairs stored \n", - "* **in** the map in Return True for a statement of the form **key in map**, if the given key is in the map, False otherwise." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class HashTable(object):\n", - " \n", - " def __init__(self,size):\n", - " \n", - " # Set up size and slots and data\n", - " self.size = size\n", - " self.slots = [None] * self.size\n", - " self.data = [None] * self.size\n", - " \n", - " def put(self,key,data):\n", - " #Note, we'll only use integer keys for ease of use with the Hash Function\n", - " \n", - " # Get the hash value\n", - " hashvalue = self.hashfunction(key,len(self.slots))\n", - "\n", - " # If Slot is Empty\n", - " if self.slots[hashvalue] == None:\n", - " self.slots[hashvalue] = key\n", - " self.data[hashvalue] = data\n", - " \n", - " else:\n", - " \n", - " # If key already exists, replace old value\n", - " if self.slots[hashvalue] == key:\n", - " self.data[hashvalue] = data \n", - " \n", - " # Otherwise, find the next available slot\n", - " else:\n", - " \n", - " nextslot = self.rehash(hashvalue,len(self.slots))\n", - " \n", - " # Get to the next slot\n", - " while self.slots[nextslot] != None and self.slots[nextslot] != key:\n", - " nextslot = self.rehash(nextslot,len(self.slots))\n", - " \n", - " # Set new key, if NONE\n", - " if self.slots[nextslot] == None:\n", - " self.slots[nextslot]=key\n", - " self.data[nextslot]=data\n", - " \n", - " # Otherwise replace old value\n", - " else:\n", - " self.data[nextslot] = data \n", - "\n", - " def hashfunction(self,key,size):\n", - " # Remainder Method\n", - " return key%size\n", - "\n", - " def rehash(self,oldhash,size):\n", - " # For finding next possible positions\n", - " return (oldhash+1)%size\n", - " \n", - " \n", - " def get(self,key):\n", - " \n", - " # Getting items given a key\n", - " \n", - " # Set up variables for our search\n", - " startslot = self.hashfunction(key,len(self.slots))\n", - " data = None\n", - " stop = False\n", - " found = False\n", - " position = startslot\n", - " \n", - " # Until we discern that its not empty or found (and haven't stopped yet)\n", - " while self.slots[position] != None and not found and not stop:\n", - " \n", - " if self.slots[position] == key:\n", - " found = True\n", - " data = self.data[position]\n", - " \n", - " else:\n", - " position=self.rehash(position,len(self.slots))\n", - " if position == startslot:\n", - " \n", - " stop = True\n", - " return data\n", - "\n", - " # Special Methods for use with Python indexing\n", - " def __getitem__(self,key):\n", - " return self.get(key)\n", - "\n", - " def __setitem__(self,key,data):\n", - " self.put(key,data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's see it in action!" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "h = HashTable(5)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Put our first key in\n", - "h[1] = 'one'" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "h[2] = 'two'" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "h[3] = 'three'" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'one'" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "h[1]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "h[1] = 'new_one'" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'new_one'" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "h[1]" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n" - ] - } - ], - "source": [ - "print h[4]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Great Job!\n", - "\n", - "That's it for this rudimentary implementation, try implementing a different hash function for practice!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Sorting and Searching/Sequential Search.ipynb b/Sorting and Searching/Sequential Search.ipynb deleted file mode 100644 index f514dc75..00000000 --- a/Sorting and Searching/Sequential Search.ipynb +++ /dev/null @@ -1,235 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Sequential Search\n", - "\n", - "Check out the video lecture for a full breakdown, in this Notebook all we do is implement Sequential Search for an Unordered List and an Ordered List." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "## Sequential Search" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def seq_search(arr,ele):\n", - " \"\"\"\n", - " General Sequential Search. Works on Unordered lists.\n", - " \"\"\"\n", - " \n", - " # Start at position 0\n", - " pos = 0\n", - " # Target becomes true if ele is in the list\n", - " found = False\n", - " \n", - " # go until end of list\n", - " while pos < len(arr) and not found:\n", - " \n", - " # If match\n", - " if arr[pos] == ele:\n", - " found = True\n", - " \n", - " # Else move one down\n", - " else:\n", - " pos = pos+1\n", - " \n", - " return found" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "arr = [1,9,2,8,3,4,7,5,6]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], - "source": [ - "print seq_search(arr,1)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "False\n" - ] - } - ], - "source": [ - "print seq_search(arr,10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Ordered List\n", - "\n", - "If we know the list is ordered than, we only have to check until we have found the element or an element greater than it." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def ordered_seq_search(arr,ele):\n", - " \"\"\"\n", - " Sequential search for an Ordered list\n", - " \"\"\"\n", - " # Start at position 0\n", - " pos = 0\n", - " \n", - " # Target becomes true if ele is in the list\n", - " found = False\n", - " \n", - " # Stop marker\n", - " stopped = False\n", - " \n", - " # go until end of list\n", - " while pos < len(arr) and not found and not stopped:\n", - " \n", - " # If match\n", - " if arr[pos] == ele:\n", - " found = True\n", - " \n", - " else:\n", - " \n", - " # Check if element is greater\n", - " if arr[pos] > ele:\n", - " stopped = True\n", - " \n", - " # Otherwise move on\n", - " else:\n", - " pos = pos+1\n", - " \n", - " return found" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "arr.sort() " - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ordered_seq_search(arr,3)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ordered_seq_search(arr,1.5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/.ipynb_checkpoints/Deques Overview-checkpoint.ipynb b/Stacks, Queues and Deques/.ipynb_checkpoints/Deques Overview-checkpoint.ipynb deleted file mode 100644 index 413f2635..00000000 --- a/Stacks, Queues and Deques/.ipynb_checkpoints/Deques Overview-checkpoint.ipynb +++ /dev/null @@ -1,69 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Deques Overview\n", - "\n", - "A deque, also known as a double-ended queue, is an ordered collection of items similar to the queue. It has two ends, a front and a rear, and the items remain positioned in the collection. What makes a deque different is the unrestrictive nature of adding and removing items. New items can be added at either the front or the rear. Likewise, existing items can be removed from either end. In a sense, this hybrid linear structure provides all the capabilities of stacks and queues in a single data structure. \n", - "\n", - "It is important to note that even though the deque can assume many of the characteristics of stacks and queues, it does not require the LIFO and FIFO orderings that are enforced by those data structures. It is up to you to make consistent use of the addition and removal operations.\n", - "\n", - "Let's see an Image to visualize the Deque Data Structure:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAATQAAAD1CAYAAADeQgk6AAAAAXNSR0IArs4c6QAAAARnQU1BAACx\njwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAGYktHRAD/AP8A/6C9p5MAAB7XSURBVHhe7d0J\nlBTV1QfwOwszDIMzrCIoIIiKAdTAETUH40IUI2riFhKTmBw1QUI+QRBZVEg8IC4QcQU0+aIRyYnR\nL4qgonjUSKLGLSdDgiKGVUD2Zfbpnvrq/+Y19Azdw3T3ne6q6v/vnD5U1fRM0a+rb7936y05jkuI\niAIg1/5LROR7DGhEFBgZb3KeddZ5UlHRxu6JhEI1UlNTKfn5BVJYWGyPNlZfLxLvf7169Qr3Z2xF\nE2WjjAe0QYPOkS5d3rF7qVu37hxZv17v7xGRf7DJSUSBEbiAlpPDGE2UrTyQQ7tUioqW2r3Ubd16\nqXz6qd7fIwqinJwcOeWUb9m9xtwfSW6cekFNTYWEQrVSWNhO8vML7VGR4uI6ee+9t+xe5jCgEWWh\n448/R/r00cs179x5jpSVZT53zfYZEQUGAxpRFgpqrpkBjSgLFRYeZbd0FBeX2q3M8kRAC4fL7ZaO\nAwcO2C0iyiaeCGiOE7ZbOuoxlICIsg6bnEQUGAxoRBQYGQ9o8TrwJSus23olChztHLN2DjwVgQto\nnGiDqHnaOWbtHHgq2OQkosBgQCOiwMh4QMNEjpqiB8wSUWzauWbt1FGyMv7fKCwssls68vLa2i0i\nikc718yARkSkjAGNiAKDAY0oC2nnmrVz4cnySEDT7RcTCoXsFhHFop1r1s6FJ8sTAS0U0u25XFFR\nYbeIKJuwyUlEgcGARkSBwYBGlGX0c8zemX8w4wEtP99uKOH9AKLmaeeYtXPgqWANjYgCgwGNiAKD\nAY2IAiPjAa2oqNhu6SgoaG+3iCge7Vyzdi48WRkPaHl5uiWRk5Nnt4go27DJSUSBwYBGRIHBgEaU\nhbRzzdq58GR5IqDV11fbLR1VVVV2i4hi0c41a+fCk+WJgOY4NXZLR21trd0iomzCJicRBQYDGhEF\nRsYDmvZqMcqLQhMFjnaOWTsHnoqMB7Q85X6w2usNEgWNdo5ZOweeCjY5iSgwGNCIKDAyHtBycnLs\nlo7cXI7lJDoS7VwzV0632rcvsVs68vM52wbRkWjnmrVz4clik5OIAoMBjYgCgwGNKAtp55q1c+HJ\nYkAjykLauWbtXHiyPBHQtJfB2r9/v90iomzikRqa7j1kx3HsFhFlEzY5iSgwGNCIKDAyHtC0l7/S\nXp6LKGi0c8zaOfBUZDygcfogovTSzzF750PHJicRBQYDGhEFRsYDWkFBod3SkZfX1m4RUTzauWbt\nXHiyMh7QCgt1A1Benm6AJAoiTh9ERORxDGhEFBgMaERZSDvXrJ0LT5YnAprj6E6fWVdXZ7eIKBbt\nXLN2LjxZOU6GR3JPmHCHLFr0rvTocZE90lgotP+IAa+gwG641q9/1v17D8vIkSPtESKKtnLlShk7\ndqV06jTFHknNvn0r5ZJLVsrMmTp/LxUZD2jr16+XtWvX2r34jjrqKMlv4b3hfv36SWlpqd0jSs33\nv/99qa6ulhdeeMEe8TcGNCKPufXWW2Xu3Ll2D/2g8uX444+X6667TqZNm+Y2qfRmZGVAa56XAhpv\nCrQyfPAwPXHTBz4k6fDTn/5ULr74YrsXLB06dJDVq1ebx4cffig/+9nPZMaMGTJv3jz7DIpFO8es\nnQNPhS8C2t/+9jfzDelX+OB98sknjR733nuv/WljuNjqOcK+RVAL69+/v3mcdtppctttt8nXvvY1\n+ec//2mfIbJ8+XL55je/aVIQBQUF5ue///3v7U8PWbx4sQwZMkSKioqkffv25nc2bNhgf9rYl19+\nKaeffrpcdNFFvpwdubKyUjZufFz27p1y8LF9e/OPHTtulz177o35+PLLu9y/WW7/emb5osk5adIk\nuf/+++2ev6CG9uSTT8rOnTvtkcZQU6uqqpLBgwebD9rWrVtl8+bN0qVLF7nvvvtk4cKFZr979+5y\n/fXXyx133HGwORX53TPOOMOcY/v27XLqqafK7373Ozn55JPlxhtvNNvRUI74P/ld03INh8OyYsUK\n+c53viOPPfaYKSv4y1/+IqFQyJQRym3JkiVyyy23yEsvvSQjRowwz3nkkUfMsdmzZ8vVV19tZqN4\n5513ZNiwYdK3b99GTc5//etf5obThRdeaN6bNm3amL/hJ/v27WtR3hpQdgcOHHl6IOSt0eTPOAQ0\nr5s4caLd8h/83zt37mz3Djdq1CjH/VA4U6dOddzgZB5uLc258847nXbt2jmLFi1y3BqB8/zzzztu\nLcMZP368/c1Dv3v33Xeb33G/eZ3LLrvMGTp0qH2G4/zkJz9x3A+u3QsOlCsuXzdImYfbjHdyc3Od\nyZMn22fEd9VVV5lyAfcD63Tq1MlxvzTNfiwoZzdQOq+99ppTUlLi/OpXv7I/Ia/xRUCbMGGC3fKf\nyAev6eODDz4wP8eHxf1mc9xmptmH2tpax232ODNmzLBHGjzwwAOO22xy3GaO2cfvuk0osx3hNrHM\n39+7d6/ZD3JAc5vyTllZmXm4zXjHrY06HTt2dKZPn26f5Zgvg5tuuskZMGCA49ZynW7dujlus9Jx\nm4vm52vWrDHl5dbuzH4sKGf8bn5+vvPoo4/ao+RFvsihud+8dsufYuXQ3A+Y/amYbdwoiPjvf/8r\n5eXlJo8T7dxzzxU32JkkeASq+tHc2ob51w1o5t8gQxNy4MCB5oGcFpqZN998s2k6oikOaFZ+9tln\nphn6/vvvm/zaFVdcYZqoiTjhhBNk0KBB8oc//EH27NljjwYfmtrIYfuFLyKFG3jtlj/hg4cPXPQD\nyeeIeP3rooMcxCqHps+J8HuZpQI3VvBB3LFjh6xatcrkHfHl0LNnTznmmGPk888/t88UkyPDl4Db\nnLRHYuvcubO8+eab5r08//zzzd/OBm3btvVVdxVfBDRcRIl+o/oZPmToSPzXv/7VHmnw1ltvmTt1\np5xyij1yZCi7oN41xTXx6aefmse///1vefrpp+Xhhx82NVm36WkeuLmCGwEoAzzmzJljasgRKB90\n9fjNb35jbsJ88cUX5oEbDqgpR8OdUgQ+BDcESNztzAZ++nL0RUDDbfk1a9bYveDDnbPx48ebD9ii\nRYtk06ZN8uc//1l+/etfy9ixY02wayncecKHHc0u3BGMNMWCAM1qBHc8cHd3ypQpcs0118jzzz9v\nfo6aL7ZRs+rWrZt53pYtW+THP/6x+XkEmqm//e1v5ZlnnjHdOlCDRkCLVXMuLi6WZcuWmab+Oeec\nc1jQCyJf1fbd/6znIbE7d+5cu+cvLbnLiTtoTeEmwT333OP06dPHJKN79epl7q7hrlxErN/FzQa8\nrevWrTP727Ztc4YPH24S4Th+//33m+NELXXrrbfaLe/zzdAnP/dFI/Iz9PlDU90PfHP7EE2KsrIy\nu0dE6YA8JfKMfuGbgOY2r+RPf/qT3SOidEDuGjlsv/BNQMPdPfQ3+uijj+wRImptr7zyysEhYn7g\nm4AGGFP33HPPcUZaojTB2OIePXrYPe/zVUCDMWPGyIMPPmj3iKi1IGeN3LWf+C6g9erVy/T/+eMf\n/2iPEFFrQM4auWs/8V1AgzPPPNP0AscUMESkD7lq5KyRu/YTX0/B/eKLL5o5wDBTqRdt3LhRLrhg\npHTocIw9Elu8UV0YqlNZuc+M1ywu7iAHDuyWa6+9Uu6663b7jAYff/yxXHPNdW6Q726PxBb/PGH3\nPPvd8+S65ymVHTs2yqRJ42TcuF/YZzTA1M0/+MH10q1bb3sktnjnCYUwxrJc8vLypajoKNmyZa08\n+uj9Zg6yaEuWLJP/+Z9bpWvX4+yR2OKfp9Y9T4V7njbuedq75/lcnnpqwWEz9z711GKZNWuOlJR0\ntkcOh09HvJFjdXU1UlNTKfn5BdK2bbF7njWyfPmLZqSBnyFHPX36dDPI3298v6bAe++9J2+88YZM\nnjw57iDvTEEOYtSoBdK580zJzW3nPlJbOqyiokyGDFks8+c3vtBeffVVueWWt6VLl9vccxS7j9S+\nVXfvXi6XXfbJYXPEY1bXu+5a7waaMW6waO8GwNQmN/zqq8UyevQ+N3COsUcazJv3mDz2mOMGzmvd\n85S450mtH9TOnfNl6tRS98vgWnukwe233+3W8gdJaekw9zylJqCnYvfue9wAPcxMDOln6ET7ve99\nz6R3/MaXTc5oZ511lltr+IFMmDDBzCbqNW3alLiBtmPKwaw5mDK6oKDUnif1JkJeXrHdOlybNh3N\neVINZs1BjRTnaDhP63XqRAA7dB7ffxRUIDeNHLUfgxkE4l3E7BRYGAPTJmMlIEwb7BXhsO5aCFVV\nlXaLSBdy0shNI0ftV4H5WsIkkJiJ4vLLLzeLZWAqGS9MmxMO19gtHchDBV2cKd6S1txlgIWsNWG+\nfj964oknzOfF7yuEBa6efeKJJ5q5rTC9C6bgQRXaC4EtCNq1a2e3dMRr2mqvO9J8hd3XKeSUoTUz\na9YsMxsvFpjxu8AmDs4++2x56KGHzCylWNEHiU7MhdVS2R4EY90r0l7hKCfHWzdxsg1yzsg9IweN\nXHQQBD4TijtOGFmAO1yYDx6T+WGyxJqa5puCGMOG5DRW4sYspcmuC6q9HEK8OFtbq9vUKS/333qT\n1DKolSHXjJwzcs/IQQdF4ANaBMajYUZTBDfMXop+NpjnacGCBbJ+/Xr7rMYwnzpycZgFFW86vsXw\n+/GeH4v2zCvx+l4FSbx1EpIX+zLXbtp6fYgxWh24npFjRq4ZOWe/L0DUVNYEtAh8WDAfPFYuRzP0\nvPPOM4vRjhs3TqZNmyZLly49rGmK1bExSBerBiEIojmLAIfa2+uvv25WYiI9JSUldktHXl7sKcu1\n46ZXe3QikCGXjJwycsvIMSPXHERZF9CawlxPyLGh5oXVgZD4RgdSzDEfq/sHjm3btk3WrVt3sPbW\np08fsxgHZtXFKudBVl+vG7yP1PSnxhLJ7eKLGV/auL6RS0ZOGV/GQZb1AS0agtkFF1xgamE33nij\nHGnkAX6O5egKCwvNhTJ48GAT2CL0q/Px26/paj7V1+suspJsbjJboHyQw0VrAK0L5Habgy8I5IiR\nK0bOGLljfFn7ffRCSzGgNSNWLgeLBh977LEmn4Zvv3fffdes/INOibhbhLxbRCKrM7UEhhvFky3N\nJ034ItKUm3tordVUIEeLIIRrDKkNtALQGoi+tqLh+cgF44sYuWHkiPH7yBn7aS4zDQxozUDXBdTC\nsDgtLqwbbrjBLIuGAIZAhrwblokjf4oXIJKV7LAz5GCRi0UtDNcZavsITsjZIneLHG40NCWR60XO\nF9cgcsDIBeMLFrlh5Ij1b6z4AwNaHLjYu3bterAWhsVnkVdDk9RvU6poSldNMBw+YLd0NA0KmYZc\nK3KuSFEgBxuphSE3ixxtvPwtrkHkeJEeQc4XNTHkyPw0739rYkCLY/jw4Wb6Hz/UwvRrGvFHBKSv\nq4Nux2avTSqDQIacK2pjaPoiF9uSnC1yu6i94YtVe+RGEDCgBYB+Lkg5atFh8CWEnCtyr5EUBloD\nyJshR4tcbVPZ2oxMBANaK6ut1W3qlJf7c/CzVzmO7swsyS7gg1YAWgORm0zI1SJni5wacrionfl8\n6sK0YEBrZbwImxO/xnGE1lfC4sWZcLjCbumorEx9eifkaNGkRL4MudtI7Q05Xe30QtAwoFGLlZaW\n2i0d+fnxRwRod+Hz8/dKpPaGnC5yuxQfA1pA1NfrDiSsq+NwLvIfBrRWlq7B6aGQ7ky21dW6IwKI\n0oEBrZWxB3/itPv55ebGzjtpdyfkHAWZx4BGnoM+WZpac4Ea8hYGtIBIV00wFNK9K1herjsigLIb\nA1or0u7wmpcXv+ai3c0hxsgbo75et9+W43C9B9LDgNaKtPsM5eRk7xjS1qA/G4ruxJSUOAY08iTH\n0Z1rPNZgb/356jg0KdMY0Cgh2t1Q4jVtw+Fyu6WjokI390fexIAWAPpz8McfEaAd0LJ8tUBSxoDW\nyrST6LFWTucsDEQNGNBaWV2dblOnpkZ3REC2014jgU3bzGJAoxbTXzk9/l3bdPXidxzd7v2xbj5Q\n+jCgUYtpz5DaXL86omQwoLWy9PXg122KVlXp3mUkSgcGtFaWrtk2wmHd6YPC8U4UMNpd0bKk2DyL\nAY08p337+OuPJiMvL/6IAO0hYwxomcWARgnRHnsZqyaYp1ytzcnhZZ4t+E4HhHbTKV6H17o63dkx\nKiuZqyM9DGitSHvwczrn4M+GHvz6NUHl9isljAGtFXHws7fp5+qK7RZlCgMaeVI4XG23dHCNhOzA\ngBYAWIRWU3Mrp6dvvcwau6WDq1hlBwa0ACgu1m3q5ObGHxHAcfDkZQxorayuTrepw8Hp3saV8jOL\nAa2VhcPag591RwR4Vbp68IdC++yWjv3799stygQGNGox/cHp8e8ysgc/JYMBLTB0mzqxRgRoTx/k\nhjT7L5EOBrRWlq7ZNmpqdJs6lZVcL5P8hwGtlbEHf+K0OyTn5MSvCaarGwqlBwMaeY7+epnxc3Xa\nXzi8yZlZDGiUEO0Or7W1uiMCKLvlOOw406r69TtPevZ8y+6lbufO86Ws7E2712Dfvn0ydOgPpUeP\npfZIatCVoa7uh/Lee43/3saNG+XCC6e653nGHklNdfVG6dRpqixb1vjvlZWVyY9+tNj92Wx7JDUV\nFWUyZMhimT+/8d9btmyZTJtW5p5nij2Sml27lsnll5fJzJmx/966devklVdekb1795ruHVh/AKM8\nIv9CbW2tFEQtqICfYVUvdJ7u0KHDwUe3bt3k2GOPlWOOOabR87NdVgc0XDzbtm2TL7/8Ur766itz\noUUeWL0HRRM9rCj6Ymt6MWJtTFxo3/72t6VPnz7mOTBgwKVy9NE6gQbKyy+VDz5o/PcQ0M4884fS\nvTsDWizxAtobb7whEyZ8oBbQ9u59U0aOfD9uQItcW6WlpeZaSWT5wcrKSvO7eK/xL67XzZs3m+u3\nzibucL0WFRXJiSeeaB4DBw5UH0XidYEPaAhMq1atks8//9w8qqqqDl5I6IaAb7jjjjvOfOPhIotc\nbIn0uUIRRi42/C4eEQxo8WU6oK1cuVLGjl2pFtD27Vspl1yyMm5AS4fq6mpZs2aNudZx3eP6x/Xe\nq1cvOeOMM9xyGKI+bZKXBCqgYfbTjz76yP3Af2A+fHhp+IbCNxW+sU466SRp27atfXZ6BC2gjRgx\n1f0S0AtoHTtOlZdfPjygjRq10P2SecQeSQ0C2kknzZdFix6zRxoEMaDFg/fuH//4h3z88cfmc4JW\nxIUXXignnHCCfUYw+P6mwBdffCELFiyQyZMny5133mneuMsuu0zuvfdeue+++2TGjBly1VVXyamn\nnpr2YJYuaGZoam5er3QNSdKe6jvboYZ29dVXy913320+GxdddJGsWLFCbrvtNvM5QX4vCHwZ0FD4\neBPwZuBNwZuDNwlvFt40vHlBFatCrZ0U5syrwde3b18ZPXq0+RzdcMMNsnz5clMpmD9/vhw44N9O\n1b4JaChkFDYKHYWPNwFvBt4UvDleVV2t3YOfg5811dfr9oT147xrnTt3lptuuslUCi6++GKZN2+e\n3HPPPbJ9+3b7DP/wfEBDoaJwUcgobBQ6Ch9vgj8E555LInflWqK51Zi089ahkN1oQnuBZr/PjIvc\nGlI3P//5z+Xpp582KZsNGzbYn3qfZwMaChGFiUJF4aKQo7tDUPqha4qm5tbLZA/+zOrUqZNMnDhR\npkyZIs8++6zMmTPHdFvyOs8FNBQaCg+FiMJEoaJwqXmhkO7FVlenOyKA/Ak3nCZNmiRXXHGFSfe8\n/vrr9ife5KmAhsJCoaHwUIjad+8yIV2D00Mh3aZOtgxJUm5FB3byAHTveOCBB0wuG5WM8nJvrqfq\niYCGwkEhobBQaEHrG0OJKSwstFs6cnPjd9fRnuItXq4uKK688kpT2UAPg//85z/2qHdkvGMtCuWR\nRx6R6dOnm177QdOuXQfp2/cJu4em3B67FRtqdPF6YYTDVbJ27e1SXX34t2N+foH079/QQRV9uI40\ntTSS7vE+zOFwpWzdeq/s2rXVHmmADry9ep0qPXvOMfuOE3bP0/xd1+bOU1Oz1a2Fr5BPPnnHHmmA\nvoSnnz5CevS4y+w7Tsg9T/NdCTBCLWqUWiPl5avd92CD2wL4P3ukATrWfve749zrrqEjbH19rfva\nK8x2PHgt8W5Y7Njxmpx/fmd55pmF9khwYcjfHXfcISNGjHBf8/n2aANcJ5gxRX9d2iNLS0Crd+vh\nqH1hWFG0N99803TBmDlzphkPGURPPvlkzGRqomP5IlCG6HfX1OOPP263DsHfjx6GlYguXbocdqHi\ndeD1NIULt+l721LoM3jmmWfavQaosS9evNjuHYIhO8nemECtf/DgwXavAcZBLlmyxO4dgiFxyS5C\n3L9/fxk0aJDdCz50nTr55JPlkksuMYP90Rvh7bfflp07d2akJ0JaAtquXbvMB+Tcc8+V8ePHy8iR\nI+Xll1+Wzz77zFRdich/EDr+/ve/y5gxY8wEDxgkj4oLxkWj9tuvXz/7zPRJS0Bbu3atDBs2zMwQ\ngKoovgEx9Qk6yn7jG99IqqZCRJnz4YcfytChQ6Vjx46ye/due7QBamaYJgmD4dMtLY3cPXv2mDY3\nIIKjADAA+fLLLzfNCBQOEfnH17/+dTnttNMOC2aA1AQ+85mQtoAWK4+EwkChoHCIyD9QEXnxxRel\ne/fu9sghmKIr8AENL7IpFAYKJcjzMxEFFW7ooBM8mp3R0BrDDZdMSEtAw4uLNDkjUAgojCDPjEEU\ndNdee60MHz78sBlftmzZYrfSKy0BremLw4tHIaAwiMjfnnrqKTPrczTcAMyEtAS0pi8OLx6FQET+\nh+nqn3vuOTn66KPtEXQy3mG30istAS36xeFF48UnMmc/EXkbbuz98pe/PLimaqy7n+mQloAWeXF4\nsXjRvKtJFDwYCjVgwADTrxTL9GVCWgIaXhxeJF4sXjQRBQ8+4y+88IL06NEjY7NxpGWkQO/evc1K\nM1iRCcMiiCi4li5dahYqSkNoOUxaamiYPQErMzGYEQXfpZdeKtOmTbN76ZWWGtrtt98us2bNsntE\nFHQ1NTXq89q1RFoCWqZeHBFll7QENCIKFnTFQiqpJTCOu6Ki+YkzYeDAgSlP8ppwQMMwplWrVtm9\n+IqLi1u8AC6GP3Xt2tXuEZHXzZ37kMye/b/Ss+fFZh9RpO4IS5zm5LSR/PzYE2du2LBIHn10asqj\nhxIOaJhJdOzY2dK794/skcZCoXL3xTX/yjCNcWQKtE2bXpWpU6+XiRNvbjhARJ734IPzZeHCUunW\nTWf44s6d8904UJqZgDZ79j7p0mWMPZKar75aLKNH75Nx43T+HhG1Pq8GtLR02yAiSgcGNCJKmPaa\nRjHmf01KUgFN6+QRAV3wiSiwMrBCXYt44r/l1cIhIn9hKCGiwGBAI6KEtW3b1m7pyM3VmR8xqYCm\ndfII7cIhotalPZQRnW41JBXQtE4ewXGeRKSBTU4iCgwGNCIKDAY0IkrKkcZsJwqzcqQq4YCmcdJo\n2oVCROlRX19pt3RUVVXZreQlHNA0ThpNu1CIKHuxyUlEgcGARkSeoDF3dsIBTeOkROR/LZyQusWO\nNONtSyQc0DROGk27UIgoe7HJSUSBwYBGRIHBgEZECSspKbFbOvLzS+1WapIKaFonj9AuHCJqXTmR\nZds8xhM1NK8WDhH5C5ucRBQYDGhEFBgMaESUlHBYdxx2RUWF3UpewgFN46TRtAuFiNJDe6acUChk\nt5KXcEDTOGk0Th9ERFrY5CSiwGBAI6KkaC8QHg7bjRQk/F/SOGk0rppO5E/5+XZDSSACmnahEFH2\nYv2IiAKDAY2IEpav3LQK1Mrp2oVDRK2ruLjYbunIy2tnt1KTVEDTOnmEduEQUXZik5OIAoMBjYgC\ngwGNiDzBcertVvISDmgaJyUi/6ut3We3dJSXH7BbyUs4oGmcNJp2oRBR9mKTk4gCgwGNiAKDAY2I\nktJGt3+91NbajRQkHNA0ThpNu1CIKD28uFhbxmtoXMGOiLSwyUlEgcGARkQJKyoqsls6cnMzODhd\n6+QR2oVDRK2roKDAbunIzc3g9EFaJ4/QLhwiyk5schJRYDCgEVFgMKARUVLq63U7pdbW1tit5CUc\n0DROGk27UIgoPUKhKrulo6am2m4lL+GApnHSaNqFQkTZi01OIgoMBjQiSor2sEXHsRspSDigaZw0\nGsdyEvmT9uqToZDdSEHCAU3jpNG4JCcRaWGTk4gCgwGNiDxAJ/eUZEBj4osom5WUlNgtHXl5On8v\nx3HZ7RYZNeoXsnHjFGnbtpc9kppdu34hL700WXr37m2PEJHXbd68WXr27CmnnPIte6Qx3OzLjVNd\nqq4+IOFwyI0h7d1A1jDRRVXVfhk+/GxZuHCe2U9WwgFt9Ojx8sYb70pRUUNEDYfr3P9gufsfy3f/\ng0eZY03V18e/O7p69QrZtGmTHHfccfYIEVFyEg5oRERexZsCRBQYDGhEFBgMaEQUGAxoRBQYDGhE\nFBgMaEQUGAxoRBQYDGhEFBAi/w/W56D6Uw33tQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "Image('http://www.codeproject.com/KB/recipes/669131/deque.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how we can both add and remove from the front and the back of the Deque. In the next lecture, we will implement our own Deque class!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Deque-checkpoint.ipynb b/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Deque-checkpoint.ipynb deleted file mode 100644 index 9016eaa9..00000000 --- a/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Deque-checkpoint.ipynb +++ /dev/null @@ -1,180 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Deque\n", - "\n", - "In this lecture we will implement our own Deque class!\n", - "\n", - "## Methods and Attributes\n", - "\n", - "* Deque() creates a new deque that is empty. It needs no parameters and returns an empty deque.\n", - "* addFront(item) adds a new item to the front of the deque. It needs the item and returns nothing.\n", - "* addRear(item) adds a new item to the rear of the deque. It needs the item and returns nothing.\n", - "* removeFront() removes the front item from the deque. It needs no parameters and returns the item. The deque is modified.\n", - "* removeRear() removes the rear item from the deque. It needs no parameters and returns the item. The deque is modified.\n", - "* isEmpty() tests to see whether the deque is empty. It needs no parameters and returns a boolean value.\n", - "* size() returns the number of items in the deque. It needs no parameters and returns an integer.\n", - "\n", - "## Deque Implementation" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Deque:\n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def addFront(self, item):\n", - " self.items.append(item)\n", - "\n", - " def addRear(self, item):\n", - " self.items.insert(0,item)\n", - "\n", - " def removeFront(self):\n", - " return self.items.pop()\n", - "\n", - " def removeRear(self):\n", - " return self.items.pop(0)\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "d = Deque()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "d.addFront('hello')" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "d.addRear('world')" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "d.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "hello world\n" - ] - } - ], - "source": [ - "print d.removeFront() + ' ' + d.removeRear()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "d.size()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Queue-checkpoint.ipynb b/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Queue-checkpoint.ipynb deleted file mode 100644 index 23c0e784..00000000 --- a/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Queue-checkpoint.ipynb +++ /dev/null @@ -1,181 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Queue\n", - "\n", - "In this lecture we will build on our previous understanding of Queues by implementing our own class of Queue!" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "____\n", - "## Queue Methods and Attributes\n", - "\n", - "\n", - "Before we begin implementing our own queue, let's review the attribute and methods it will have:\n", - "\n", - "* Queue() creates a new queue that is empty. It needs no parameters and returns an empty queue.\n", - "* enqueue(item) adds a new item to the rear of the queue. It needs the item and returns nothing.\n", - "* dequeue() removes the front item from the queue. It needs no parameters and returns the item. The queue is modified.\n", - "* isEmpty() tests to see whether the queue is empty. It needs no parameters and returns a boolean value.\n", - "* size() returns the number of items in the queue. It needs no parameters and returns an integer." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "## Queue Implementation" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Queue:\n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def enqueue(self, item):\n", - " self.items.insert(0,item)\n", - "\n", - " def dequeue(self):\n", - " return self.items.pop()\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "q = Queue()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q.isEmpty()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "q.enqueue(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q.dequeue()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Stack-checkpoint.ipynb b/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Stack-checkpoint.ipynb deleted file mode 100644 index fc3983dd..00000000 --- a/Stacks, Queues and Deques/.ipynb_checkpoints/Implementation of Stack-checkpoint.ipynb +++ /dev/null @@ -1,334 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Stack\n", - "\n", - "## Stack Attributes and Methods\n", - "\n", - "Before we implement our own Stack class, let's review the properties and methods of a Stack.\n", - "\n", - "The stack abstract data type is defined by the following structure and operations. A stack is structured, as described above, as an ordered collection of items where items are added to and removed from the end called the “top.” Stacks are ordered LIFO. The stack operations are given below.\n", - "\n", - "* Stack() creates a new stack that is empty. It needs no parameters and returns an empty stack.\n", - "* push(item) adds a new item to the top of the stack. It needs the item and returns nothing.\n", - "* pop() removes the top item from the stack. It needs no parameters and returns the item. The stack is modified.\n", - "* peek() returns the top item from the stack but does not remove it. It needs no parameters. The stack is not modified.\n", - "* isEmpty() tests to see whether the stack is empty. It needs no parameters and returns a boolean value.\n", - "* size() returns the number of items on the stack. It needs no parameters and returns an integer." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "\n", - "## Stack Implementation" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "class Stack:\n", - " \n", - " \n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def push(self, item):\n", - " self.items.append(item)\n", - "\n", - " def pop(self):\n", - " return self.items.pop()\n", - "\n", - " def peek(self):\n", - " return self.items[len(self.items)-1]\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's try it out!" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "s = Stack()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], - "source": [ - "print s.isEmpty()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "s.push(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "s.push('two')" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'two'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.peek()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "s.push(True)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "3" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.isEmpty()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "two\n" - ] - } - ], - "source": [ - "s.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.isEmpty()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/.ipynb_checkpoints/Queues Overview-checkpoint.ipynb b/Stacks, Queues and Deques/.ipynb_checkpoints/Queues Overview-checkpoint.ipynb deleted file mode 100644 index be7a713a..00000000 --- a/Stacks, Queues and Deques/.ipynb_checkpoints/Queues Overview-checkpoint.ipynb +++ /dev/null @@ -1,115 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Queues Overview\n", - "\n", - "In this lecture we will get an overview of what a Queue is, in the next lecture we will implement our own Queue class." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "A **queue** is an ordered collection of items where the addition of new items happens at one end, called the “rear,” and the removal of existing items occurs at the other end, commonly called the “front.” As an element enters the queue it starts at the rear and makes its way toward the front, waiting until that time when it is the next element to be removed.\n", - "\n", - "The most recently added item in the queue must wait at the end of the collection. The item that has been in the collection the longest is at the front. This ordering principle is sometimes called **FIFO, first-in first-out**. It is also known as “first-come first-served.”\n", - "\n", - "The simplest example of a queue is the typical line that we all participate in from time to time. We wait in a line for a movie, we wait in the check-out line at a grocery store, and we wait in the cafeteria line. The first person in that line is also the first person to get serviced/helped. \n", - "\n", - "Let's see a diagram which shows this and compares it to the Stack Data Structure:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "url = 'https://netmatze.files.wordpress.com/2014/08/queue.png'\n", - "Image(url)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how we have two terms here, **Enqueue** and **Dequeue**. The enqueue term describes when we add a new item to the rear of the queue. The dequeue term describes removing the front item from the queue.\n", - "\n", - "Let's take a look at how pop and push methods would work with a Queue (versus that of a Stack):" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEP\nERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4e\nHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCADwApUDASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD7Looo\noAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig\nAooooAKKKKACiiigArwfw9ow1waxqOo694tadvEGrwgQ+J9QgjRI9QuI40WOOdUVVRFUAADAr3iv\nGvh//wAgvVv+xk1v/wBOl1WlJJvU5cXJxgmn1D/hD7D/AKDfjP8A8K/VP/kij/hD7D/oN+M//Cv1\nT/5IroqK35Y9jzva1P5mcb4g8NNZaTNcaTL411W9GBDbDxtqMIYk4yztcYVR1JAJwDhWOAcH4Q6L\nea34HhvvEfiDxVLqgvbyC4Nv4t1RYgY7mWMBP34O0BQATyQMnnNeoVzHwx0q/wBG8LPZalB5FwdS\n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\nDNgcgEYUnj23wzrNj4i8O6br2mOz2Wo2sd1bsy4Yo6hlyOxwarlet+m5HMna3Xb+v63NCiiikMKK\nKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo\noAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig\nAooooAKKKKACiiigAooooAKKKKACiiigAooooA82/aQ8Eat46+Gctj4dkjTXtOu4dT0vzGCq08LZ\nC5PAyCwBOBkjJAzXmfir9qjTNK8LQ+bp6aD4zs5Yzqvh3xBaXkMjRiPc6wSRROoZyVEbSYGDuYAY\nz9K0UtVdJ6PX5/0tR3Ts300/r9D5R+C2tJ8WfF3xR8T39xZ6T4l1bRm0XTvDss/+lW1uIuXYMqlg\nXKHIGAc5xkVyEfxO0WL9kG/+FS6frD+M9OsZ7XUdN+wyKbJEnLPPK5GxUUYGM7txC45zX2l/Zmm/\n2v8A2x/Z9p/aXkfZvtnkr53k7t3l78btm7nbnGeat0TSlBwWiat919fnd39Rxk1JSe6d/wAtPwVj\n5I+MvhK1vvAHwc8a6/4YvvE3hLRNDji16ysnkE0cElrGRONjKdqFSzHI6DJwcir4U0r9m/W/iB4d\n0/4SfDq98V34vY5ry+S+1K2t9JiQ7vPkaY4Y5HypjDEYyCQD9g0Valabku7f367+vo/Pa2co3jby\nt/S9D5d8JeO9F+D/AMcfihpPjODVYbrxDqMWpaHHbWEk7akHD7YoggOXLMEGcLuBBIIrlfAXhPXP\nHX7IHxB0bTLCRdYbxVdXS2LN87PG0DtDx1bAYD1OK+zKKzcbxs97Jfc00/wV+/331U7SbWzd/vvf\n82fDv/GKj+H1gsvhjrt545I8j/hExNqi3f2oEq0RbcUGCCSRkgfw7vlr7G+H+lxaL4H0XSoNHXRU\ntrKJBpy3TXItTtGYvNbl9pyNx64zW5RWnNo/P7v69b/55KNmvL7woooqSgooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigDifjh49Pw0+HF94vXSP7XNrJDGLX7T5G/zJFT7+1sY3Z6Vxy/EX46so\nYfs65BGR/wAVrZf/ABFRftu7v+GdNc2Y3fabPGemftEdSQ/8NS+Sm3/hTW3aMZ/tLNTB35r9Hb8E\n/wBRz05bdV+p6r4VvdW1Hw9ZXuu6L/YmpzRBrnT/ALUtx9nb+75ifK/1FadfNn7TOla3rnif4KaP\nqt+NP1a81KWG/udIdkEbNFEJjAz/ADKMb9pPI4PWubl+EfhjTP2m1+F+jT6tpngjV/Dq6rqmjW+o\nziO8eOR4wjuXL7SQCfmz1HArS15eraXbRc33W9SW1GKu+if3u35+h9b0V8//ALLVlH4Y+JHxW8A6\nTLcL4d0XUraTTbSWVpBbecjs6qzc44XqSeMkkkk+dfs9fBHw38SPhXq+q+J7zUpbwapew6M8V1Ii\naUQ+TLGikKzs/LFs5CoOMVF1bmW3LzfLT/MpqzcXupcv5/5H0n8ZfHtv8NvAdz4puNOl1ERTRQR2\n8cgj3vI4QZYg4HOScH6V2VfFPxHmT4h/sZeHfFvixH1HxDo+ojT4715XDMDciJ2IDYdmREyzAnOT\nwTmvTvjP4W0P4USfDPxp4ZsPsGkeFNVOn3UYkeTy7G8LLIxZyWIVmJGSeXqktbP+a33pW/Nfe+2p\nLa6WqTfzTaf5f1fT6IorxLwuP+E1/au8Ra8wEmm+CNLj0mzPO03dx+8mdfcJlD9RXttJaxUu/wDn\np96s/mJ/E12/y1+56fIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPO/2i/A+sfEX\n4T6l4U0K4sLe/uZYJI5L13WIeXKrnJRWPRT2rnEX9qZEVR/wpnAGB/yEq9nopJWv56/p+g2728jy\nDXvAnxA8Va18MvEHiS58MRan4a1K4utWTT3nEEiONqCAOpYnaBncV5zita88BaxN+0jZfElbmwGk\nQeHG0poS7/aDKZmfcF27duGHO7Oe1ek0VV9vJt/euV/gS4338vwd/wAzzX4Z+AdY8M/Ff4ieLL+5\nsJLHxNcWstlHA7mWMRIyt5gKgA5YYwW/CvBf2ePDvxivfhbq0Pw/8S+GrTR9Y1W9iuhqsMxubBw+\nxpLYxgqxZcHD8AqMdSa+xKw/BPhLw/4L0VtG8M6f9gsWnkuDF50kn7xzlmy7E8ntnFKMY25Xty2/\nFb/JFyk23JbuV/wf+Z5n4y+CBm/Zug+FPhXU4Ybmy8mW3ur1SEmmWbzXZ9oJUMxboDjI64rX+I2n\napqn7OHiSy+KE+hw6gdJuXvZtL8z7JGybniZPM+ckbYzg9WzjtXqNcn8Qfhx4K8fyaY/jDQotWOl\nytLaCSWRVRm25yqsA4O1cq2QcdKmonUUk/tb/ldfhp5BTag4v+X/AIe339fM479kTwxd+HPglpdz\nqplfVtdd9XvnlOXZ5sbCc858sR5z3zXrtIoCqFUAADAA7Uta1Jc8mzKnHlikFFFFQWf/2Q==\n", - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "url2 = 'http://www.csit.parkland.edu/~mbrandyberry/CS2Java/Lessons/Stack_Queue/images/QueuePushPop.jpg'\n", - "Image(url2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion\n", - "\n", - "You should now have a basic understanding of Queues and the FIFO principal for them. In the next lecture we will implement our own Queue class!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/.ipynb_checkpoints/Stacks Overview-checkpoint.ipynb b/Stacks, Queues and Deques/.ipynb_checkpoints/Stacks Overview-checkpoint.ipynb deleted file mode 100644 index 8089314d..00000000 --- a/Stacks, Queues and Deques/.ipynb_checkpoints/Stacks Overview-checkpoint.ipynb +++ /dev/null @@ -1,94 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Stacks Overview\n", - "\n", - "**Please see the lecture video for the full Overview on Stacks!**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "\n", - "A stack is an ordered collection of items where the addition of new items and the removal of existing items always takes place at the same end. This end is commonly referred to as the “top.” The end opposite the top is known as the “base.” \n", - "\n", - "The base of the stack is significant since items stored in the stack that are closer to the base represent those that have been in the stack the longest. The most recently added item is the one that is in position to be removed first. \n", - "\n", - "**This ordering principle is sometimes called LIFO, last-in first-out.** It provides an ordering based on length of time in the collection. Newer items are near the top, while older items are near the base.\n", - "\n", - "For example, consider the figure below:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "url ='https://upload.wikimedia.org/wikipedia/commons/b/b4/Lifo_stack.png'\n", - "\n", - "Image(url)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how the first items \"pushed\" to the stack begin at the base, and as items are \"popped\" out. Stacks are fundamentally important, as they can be used to reverse the order of items. The order of insertion is the reverse of the order of removal.\n", - "\n", - "Considering this reversal property, you can perhaps think of examples of stacks that occur as you use your computer. For example, every web browser has a Back button. As you navigate from web page to web page, those pages are placed on a stack (actually it is the URLs that are going on the stack). The current page that you are viewing is on the top and the first page you looked at is at the base. If you click on the Back button, you begin to move in reverse order through the pages.\n", - "\n", - "In the next lecture we will implement our own Stack class!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Extra Resources:\n", - "[Wikipedia Page on Stacks](http://bit.ly/1OJybGQ)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/.ipynb_checkpoints/Stacks, Queues, and Deques Overview-checkpoint.ipynb b/Stacks, Queues and Deques/.ipynb_checkpoints/Stacks, Queues, and Deques Overview-checkpoint.ipynb deleted file mode 100644 index e020c9b7..00000000 --- a/Stacks, Queues and Deques/.ipynb_checkpoints/Stacks, Queues, and Deques Overview-checkpoint.ipynb +++ /dev/null @@ -1,53 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Stacks, Queues, and Deques Overview" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this section of the course we will be learning about Stack, Queues, and Deques. These are linear structures. They are similar to arrays, but each of these structures differs by how it adds and removes items.\n", - "\n", - "Here's what to expect in this section:\n", - "\n", - " 1.) A Brief Overview of the Linear Structures\n", - " 2.) An Overview of Stacks\n", - " 3.) An Implementation of a Stack class\n", - " 4.) An Overview of Queues\n", - " 5.) An Implementation of a Queue class\n", - " 6.) An Overview of Deques\n", - " 7.) An Implementation of a Deque class\n", - " \n", - " Then finally a variety of interview questions based on Stacks, Queues, and Deques!\n", - " \n", - "**See the lecture video for a complete breakdown of this Section of the course!**" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Deques Overview.ipynb b/Stacks, Queues and Deques/Deques Overview.ipynb deleted file mode 100644 index 413f2635..00000000 --- a/Stacks, Queues and Deques/Deques Overview.ipynb +++ /dev/null @@ -1,69 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Deques Overview\n", - "\n", - "A deque, also known as a double-ended queue, is an ordered collection of items similar to the queue. It has two ends, a front and a rear, and the items remain positioned in the collection. What makes a deque different is the unrestrictive nature of adding and removing items. New items can be added at either the front or the rear. Likewise, existing items can be removed from either end. In a sense, this hybrid linear structure provides all the capabilities of stacks and queues in a single data structure. \n", - "\n", - "It is important to note that even though the deque can assume many of the characteristics of stacks and queues, it does not require the LIFO and FIFO orderings that are enforced by those data structures. It is up to you to make consistent use of the addition and removal operations.\n", - "\n", - "Let's see an Image to visualize the Deque Data Structure:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "Image('http://www.codeproject.com/KB/recipes/669131/deque.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how we can both add and remove from the front and the back of the Deque. In the next lecture, we will implement our own Deque class!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Implementation of Deque.ipynb b/Stacks, Queues and Deques/Implementation of Deque.ipynb deleted file mode 100644 index 9016eaa9..00000000 --- a/Stacks, Queues and Deques/Implementation of Deque.ipynb +++ /dev/null @@ -1,180 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Deque\n", - "\n", - "In this lecture we will implement our own Deque class!\n", - "\n", - "## Methods and Attributes\n", - "\n", - "* Deque() creates a new deque that is empty. It needs no parameters and returns an empty deque.\n", - "* addFront(item) adds a new item to the front of the deque. It needs the item and returns nothing.\n", - "* addRear(item) adds a new item to the rear of the deque. It needs the item and returns nothing.\n", - "* removeFront() removes the front item from the deque. It needs no parameters and returns the item. The deque is modified.\n", - "* removeRear() removes the rear item from the deque. It needs no parameters and returns the item. The deque is modified.\n", - "* isEmpty() tests to see whether the deque is empty. It needs no parameters and returns a boolean value.\n", - "* size() returns the number of items in the deque. It needs no parameters and returns an integer.\n", - "\n", - "## Deque Implementation" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Deque:\n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def addFront(self, item):\n", - " self.items.append(item)\n", - "\n", - " def addRear(self, item):\n", - " self.items.insert(0,item)\n", - "\n", - " def removeFront(self):\n", - " return self.items.pop()\n", - "\n", - " def removeRear(self):\n", - " return self.items.pop(0)\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "d = Deque()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "d.addFront('hello')" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "d.addRear('world')" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "d.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "hello world\n" - ] - } - ], - "source": [ - "print d.removeFront() + ' ' + d.removeRear()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "d.size()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Implementation of Queue.ipynb b/Stacks, Queues and Deques/Implementation of Queue.ipynb deleted file mode 100644 index 23c0e784..00000000 --- a/Stacks, Queues and Deques/Implementation of Queue.ipynb +++ /dev/null @@ -1,181 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Queue\n", - "\n", - "In this lecture we will build on our previous understanding of Queues by implementing our own class of Queue!" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "____\n", - "## Queue Methods and Attributes\n", - "\n", - "\n", - "Before we begin implementing our own queue, let's review the attribute and methods it will have:\n", - "\n", - "* Queue() creates a new queue that is empty. It needs no parameters and returns an empty queue.\n", - "* enqueue(item) adds a new item to the rear of the queue. It needs the item and returns nothing.\n", - "* dequeue() removes the front item from the queue. It needs no parameters and returns the item. The queue is modified.\n", - "* isEmpty() tests to see whether the queue is empty. It needs no parameters and returns a boolean value.\n", - "* size() returns the number of items in the queue. It needs no parameters and returns an integer." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "## Queue Implementation" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Queue:\n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def enqueue(self, item):\n", - " self.items.insert(0,item)\n", - "\n", - " def dequeue(self):\n", - " return self.items.pop()\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "q = Queue()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q.isEmpty()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "q.enqueue(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q.dequeue()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Implementation of Stack.ipynb b/Stacks, Queues and Deques/Implementation of Stack.ipynb deleted file mode 100644 index fc3983dd..00000000 --- a/Stacks, Queues and Deques/Implementation of Stack.ipynb +++ /dev/null @@ -1,334 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementation of Stack\n", - "\n", - "## Stack Attributes and Methods\n", - "\n", - "Before we implement our own Stack class, let's review the properties and methods of a Stack.\n", - "\n", - "The stack abstract data type is defined by the following structure and operations. A stack is structured, as described above, as an ordered collection of items where items are added to and removed from the end called the “top.” Stacks are ordered LIFO. The stack operations are given below.\n", - "\n", - "* Stack() creates a new stack that is empty. It needs no parameters and returns an empty stack.\n", - "* push(item) adds a new item to the top of the stack. It needs the item and returns nothing.\n", - "* pop() removes the top item from the stack. It needs no parameters and returns the item. The stack is modified.\n", - "* peek() returns the top item from the stack but does not remove it. It needs no parameters. The stack is not modified.\n", - "* isEmpty() tests to see whether the stack is empty. It needs no parameters and returns a boolean value.\n", - "* size() returns the number of items on the stack. It needs no parameters and returns an integer." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "\n", - "## Stack Implementation" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "class Stack:\n", - " \n", - " \n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def push(self, item):\n", - " self.items.append(item)\n", - "\n", - " def pop(self):\n", - " return self.items.pop()\n", - "\n", - " def peek(self):\n", - " return self.items[len(self.items)-1]\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's try it out!" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "s = Stack()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], - "source": [ - "print s.isEmpty()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "s.push(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "s.push('two')" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'two'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.peek()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "s.push(True)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "3" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.isEmpty()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "two\n" - ] - } - ], - "source": [ - "s.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s.isEmpty()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Queues Overview.ipynb b/Stacks, Queues and Deques/Queues Overview.ipynb deleted file mode 100644 index be7a713a..00000000 --- a/Stacks, Queues and Deques/Queues Overview.ipynb +++ /dev/null @@ -1,115 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Queues Overview\n", - "\n", - "In this lecture we will get an overview of what a Queue is, in the next lecture we will implement our own Queue class." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "A **queue** is an ordered collection of items where the addition of new items happens at one end, called the “rear,” and the removal of existing items occurs at the other end, commonly called the “front.” As an element enters the queue it starts at the rear and makes its way toward the front, waiting until that time when it is the next element to be removed.\n", - "\n", - "The most recently added item in the queue must wait at the end of the collection. The item that has been in the collection the longest is at the front. This ordering principle is sometimes called **FIFO, first-in first-out**. It is also known as “first-come first-served.”\n", - "\n", - "The simplest example of a queue is the typical line that we all participate in from time to time. We wait in a line for a movie, we wait in the check-out line at a grocery store, and we wait in the cafeteria line. The first person in that line is also the first person to get serviced/helped. \n", - "\n", - "Let's see a diagram which shows this and compares it to the Stack Data Structure:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "url = 'https://netmatze.files.wordpress.com/2014/08/queue.png'\n", - "Image(url)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how we have two terms here, **Enqueue** and **Dequeue**. The enqueue term describes when we add a new item to the rear of the queue. The dequeue term describes removing the front item from the queue.\n", - "\n", - "Let's take a look at how pop and push methods would work with a Queue (versus that of a Stack):" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEP\nERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4e\nHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCADwApUDASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD7Looo\noAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig\nAooooAKKKKACiiigArwfw9ow1waxqOo694tadvEGrwgQ+J9QgjRI9QuI40WOOdUVVRFUAADAr3iv\nGvh//wAgvVv+xk1v/wBOl1WlJJvU5cXJxgmn1D/hD7D/AKDfjP8A8K/VP/kij/hD7D/oN+M//Cv1\nT/5IroqK35Y9jzva1P5mcb4g8NNZaTNcaTL411W9GBDbDxtqMIYk4yztcYVR1JAJwDhWOAcH4Q6L\nea34HhvvEfiDxVLqgvbyC4Nv4t1RYgY7mWMBP34O0BQATyQMnnNeoVzHwx0q/wBG8LPZalB5FwdS\n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\nDNgcgEYUnj23wzrNj4i8O6br2mOz2Wo2sd1bsy4Yo6hlyOxwarlet+m5HMna3Xb+v63NCiiikMKK\nKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo\noAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig\nAooooAKKKKACiiigAooooAKKKKACiiigAooooA82/aQ8Eat46+Gctj4dkjTXtOu4dT0vzGCq08LZ\nC5PAyCwBOBkjJAzXmfir9qjTNK8LQ+bp6aD4zs5Yzqvh3xBaXkMjRiPc6wSRROoZyVEbSYGDuYAY\nz9K0UtVdJ6PX5/0tR3Ts300/r9D5R+C2tJ8WfF3xR8T39xZ6T4l1bRm0XTvDss/+lW1uIuXYMqlg\nXKHIGAc5xkVyEfxO0WL9kG/+FS6frD+M9OsZ7XUdN+wyKbJEnLPPK5GxUUYGM7txC45zX2l/Zmm/\n2v8A2x/Z9p/aXkfZvtnkr53k7t3l78btm7nbnGeat0TSlBwWiat919fnd39Rxk1JSe6d/wAtPwVj\n5I+MvhK1vvAHwc8a6/4YvvE3hLRNDji16ysnkE0cElrGRONjKdqFSzHI6DJwcir4U0r9m/W/iB4d\n0/4SfDq98V34vY5ry+S+1K2t9JiQ7vPkaY4Y5HypjDEYyCQD9g0Valabku7f367+vo/Pa2co3jby\nt/S9D5d8JeO9F+D/AMcfihpPjODVYbrxDqMWpaHHbWEk7akHD7YoggOXLMEGcLuBBIIrlfAXhPXP\nHX7IHxB0bTLCRdYbxVdXS2LN87PG0DtDx1bAYD1OK+zKKzcbxs97Jfc00/wV+/331U7SbWzd/vvf\n82fDv/GKj+H1gsvhjrt545I8j/hExNqi3f2oEq0RbcUGCCSRkgfw7vlr7G+H+lxaL4H0XSoNHXRU\ntrKJBpy3TXItTtGYvNbl9pyNx64zW5RWnNo/P7v69b/55KNmvL7woooqSgooooAKKKKACiiigAoo\nooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigDifjh49Pw0+HF94vXSP7XNrJDGLX7T5G/zJFT7+1sY3Z6Vxy/EX46so\nYfs65BGR/wAVrZf/ABFRftu7v+GdNc2Y3fabPGemftEdSQ/8NS+Sm3/hTW3aMZ/tLNTB35r9Hb8E\n/wBRz05bdV+p6r4VvdW1Hw9ZXuu6L/YmpzRBrnT/ALUtx9nb+75ifK/1FadfNn7TOla3rnif4KaP\nqt+NP1a81KWG/udIdkEbNFEJjAz/ADKMb9pPI4PWubl+EfhjTP2m1+F+jT6tpngjV/Dq6rqmjW+o\nziO8eOR4wjuXL7SQCfmz1HArS15eraXbRc33W9SW1GKu+if3u35+h9b0V8//ALLVlH4Y+JHxW8A6\nTLcL4d0XUraTTbSWVpBbecjs6qzc44XqSeMkkkk+dfs9fBHw38SPhXq+q+J7zUpbwapew6M8V1Ii\naUQ+TLGikKzs/LFs5CoOMVF1bmW3LzfLT/MpqzcXupcv5/5H0n8ZfHtv8NvAdz4puNOl1ERTRQR2\n8cgj3vI4QZYg4HOScH6V2VfFPxHmT4h/sZeHfFvixH1HxDo+ojT4715XDMDciJ2IDYdmREyzAnOT\nwTmvTvjP4W0P4USfDPxp4ZsPsGkeFNVOn3UYkeTy7G8LLIxZyWIVmJGSeXqktbP+a33pW/Nfe+2p\nLa6WqTfzTaf5f1fT6IorxLwuP+E1/au8Ra8wEmm+CNLj0mzPO03dx+8mdfcJlD9RXttJaxUu/wDn\np96s/mJ/E12/y1+56fIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii\ngAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA\nCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPO/2i/A+sfEX\n4T6l4U0K4sLe/uZYJI5L13WIeXKrnJRWPRT2rnEX9qZEVR/wpnAGB/yEq9nopJWv56/p+g2728jy\nDXvAnxA8Va18MvEHiS58MRan4a1K4utWTT3nEEiONqCAOpYnaBncV5zita88BaxN+0jZfElbmwGk\nQeHG0poS7/aDKZmfcF27duGHO7Oe1ek0VV9vJt/euV/gS4338vwd/wAzzX4Z+AdY8M/Ff4ieLL+5\nsJLHxNcWstlHA7mWMRIyt5gKgA5YYwW/CvBf2ePDvxivfhbq0Pw/8S+GrTR9Y1W9iuhqsMxubBw+\nxpLYxgqxZcHD8AqMdSa+xKw/BPhLw/4L0VtG8M6f9gsWnkuDF50kn7xzlmy7E8ntnFKMY25Xty2/\nFb/JFyk23JbuV/wf+Z5n4y+CBm/Zug+FPhXU4Ybmy8mW3ur1SEmmWbzXZ9oJUMxboDjI64rX+I2n\napqn7OHiSy+KE+hw6gdJuXvZtL8z7JGybniZPM+ckbYzg9WzjtXqNcn8Qfhx4K8fyaY/jDQotWOl\nytLaCSWRVRm25yqsA4O1cq2QcdKmonUUk/tb/ldfhp5BTag4v+X/AIe339fM479kTwxd+HPglpdz\nqplfVtdd9XvnlOXZ5sbCc858sR5z3zXrtIoCqFUAADAA7Uta1Jc8mzKnHlikFFFFQWf/2Q==\n", - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "url2 = 'http://www.csit.parkland.edu/~mbrandyberry/CS2Java/Lessons/Stack_Queue/images/QueuePushPop.jpg'\n", - "Image(url2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion\n", - "\n", - "You should now have a basic understanding of Queues and the FIFO principal for them. In the next lecture we will implement our own Queue class!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks Overview.ipynb b/Stacks, Queues and Deques/Stacks Overview.ipynb deleted file mode 100644 index 8089314d..00000000 --- a/Stacks, Queues and Deques/Stacks Overview.ipynb +++ /dev/null @@ -1,94 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Stacks Overview\n", - "\n", - "**Please see the lecture video for the full Overview on Stacks!**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "____\n", - "\n", - "A stack is an ordered collection of items where the addition of new items and the removal of existing items always takes place at the same end. This end is commonly referred to as the “top.” The end opposite the top is known as the “base.” \n", - "\n", - "The base of the stack is significant since items stored in the stack that are closer to the base represent those that have been in the stack the longest. The most recently added item is the one that is in position to be removed first. \n", - "\n", - "**This ordering principle is sometimes called LIFO, last-in first-out.** It provides an ordering based on length of time in the collection. Newer items are near the top, while older items are near the base.\n", - "\n", - "For example, consider the figure below:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "url ='https://upload.wikimedia.org/wikipedia/commons/b/b4/Lifo_stack.png'\n", - "\n", - "Image(url)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how the first items \"pushed\" to the stack begin at the base, and as items are \"popped\" out. Stacks are fundamentally important, as they can be used to reverse the order of items. The order of insertion is the reverse of the order of removal.\n", - "\n", - "Considering this reversal property, you can perhaps think of examples of stacks that occur as you use your computer. For example, every web browser has a Back button. As you navigate from web page to web page, those pages are placed on a stack (actually it is the URLs that are going on the stack). The current page that you are viewing is on the top and the first page you looked at is at the base. If you click on the Back button, you begin to move in reverse order through the pages.\n", - "\n", - "In the next lecture we will implement our own Stack class!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Extra Resources:\n", - "[Wikipedia Page on Stacks](http://bit.ly/1OJybGQ)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Balanced Parentheses Check -checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Balanced Parentheses Check -checkpoint.ipynb deleted file mode 100644 index 40a0f8e4..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Balanced Parentheses Check -checkpoint.ipynb +++ /dev/null @@ -1,169 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Balanced Parentheses Check \n", - "\n", - "## Problem Statement\n", - "\n", - "Given a string of opening and closing parentheses, check whether it’s balanced. We have 3 types of parentheses: round brackets: (), square brackets: [], and curly brackets: {}. Assume that the string doesn’t contain any other character than these, no spaces words or numbers. As a reminder, balanced parentheses require every opening parenthesis to be closed in the reverse order opened. For example ‘([])’ is balanced but ‘([)]’ is not. \n", - "\n", - "\n", - "You can assume the input string has no spaces.\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def balance_check(s):\n", - " chars = []\n", - " matches = {')':'(',']':'[','}':'{'}\n", - " for c in s:\n", - " if c in matches:\n", - " if chars.pop() != matches[c]:\n", - " return False\n", - " else:\n", - " chars.append(c)\n", - " return chars == [] \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('[]')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('[](){([[[]]])}')" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('()(){]}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestBalanceCheck(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol('[](){([[[]]])}('),False)\n", - " assert_equal(sol('[{{{(())}}}]((()))'),True)\n", - " assert_equal(sol('[[[]])]'),False)\n", - " print ('ALL TEST CASES PASSED')\n", - " \n", - "# Run Tests\n", - "\n", - "t = TestBalanceCheck()\n", - "t.test(balance_check)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Deque -checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Deque -checkpoint.ipynb deleted file mode 100644 index d5c255f7..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Deque -checkpoint.ipynb +++ /dev/null @@ -1,51 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Deque \n", - "\n", - "Finally, implement a Deque class! It should be able to do the following:\n", - "\n", - "* Check if its empty\n", - "* Add to both front and rear\n", - "* Remove from Front and Rear\n", - "* Check the Size" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Deque(object):\n", - " pass" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Queue -Using Two Stacks -checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Queue -Using Two Stacks -checkpoint.ipynb deleted file mode 100644 index 521c8245..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Queue -Using Two Stacks -checkpoint.ipynb +++ /dev/null @@ -1,131 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Queue - Using Two Stacks\n", - "\n", - "Given the Stack class below, implement a Queue class using **two** stacks! Note, this is a \"classic\" interview problem. Use a Python list data structure as your Stack." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Uses lists instead of your own Stack class.\n", - "stack1 = []\n", - "stack2 = []" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "class Queue2Stacks(object):\n", - " \n", - " def __init__(self):\n", - " \n", - " # Two Stacks\n", - " self.in_stack = []\n", - " self.out_stack = []\n", - " \n", - " def enqueue(self, element):\n", - " # FILL OUT CODE HERE\n", - " self.in_stack.append(element)\n", - " pass\n", - " \n", - " def dequeue(self):\n", - " \n", - " # FILL OUT CODE HERE\n", - " if not self.out_stack:\n", - " while self.in_stack:\n", - " self.out_stack.append(self.in_stack.pop())\n", - " return self.out_stack.pop()\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "You should be able to tell with your current knowledge of Stacks and Queues if this is working as it should. For example, the following should print as such:" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n", - "4\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO CHECK THAT YOUR SOLUTION OUTPUT MAKES SENSE AND BEHAVES AS A QUEUE\n", - "\"\"\"\n", - "q = Queue2Stacks()\n", - "\n", - "for i in range(5):\n", - " q.enqueue(i)\n", - " \n", - "for i in range(5):\n", - " print (q.dequeue())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Queue-checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Queue-checkpoint.ipynb deleted file mode 100644 index 2a758805..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Queue-checkpoint.ipynb +++ /dev/null @@ -1,104 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Queue\n", - "\n", - "It's very common to be asked to implement a Queue class! The class should be able to do the following:\n", - "\n", - "* Check if Queue is Empty\n", - "* Enqueue\n", - "* Dequeue\n", - "* Return the size of the Queue" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "class Queue(object):\n", - " def __init__(self):\n", - " self.items = []\n", - " def is_empty(self):\n", - " return self.items == []\n", - " def enqueue(self, e):\n", - " self.items.insert(0, e)\n", - " def dequeue(self):\n", - " return self.items.pop()\n", - " def size(self):\n", - " return len(self.items)\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n", - "two\n", - "3\n" - ] - }, - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q = Queue()\n", - "q.is_empty()\n", - "q.enqueue(1)\n", - "q.enqueue('two')\n", - "q.enqueue(3)\n", - "q.size()\n", - "print(q.dequeue())\n", - "print(q.dequeue())\n", - "print(q.dequeue())\n", - "q.is_empty()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Stack -checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Stack -checkpoint.ipynb deleted file mode 100644 index d0f206c3..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/.ipynb_checkpoints/Implement a Stack -checkpoint.ipynb +++ /dev/null @@ -1,228 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Stack \n", - "\n", - "A very common interview question is to begin by just implementing a Stack! Try your best to implement your own stack!\n", - "\n", - "It should have the methods:\n", - "\n", - "* Check if its empty\n", - "* Push a new item\n", - "* Pop an item\n", - "* Peek at the top item\n", - "* Return the size" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "metadata": {}, - "outputs": [], - "source": [ - "class Stack(object):\n", - " # Fill out the Stack Methods here\n", - " def __init__(self):\n", - " self.items = []\n", - " def isEmpty(self):\n", - " return len(self.items) == 0\n", - " def push(self, e):\n", - " self.items.append(e)\n", - " def pop(self):\n", - " return self.items.pop()\n", - " def size(self):\n", - " return len(self.items)\n", - " def peek(self):\n", - " return self.items[self.size()-1] # reuse the size funtion\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [], - "source": [ - "stack = Stack()" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [], - "source": [ - "stack.push(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [], - "source": [ - "stack.push(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [], - "source": [ - "stack.push('Three')" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Three'" - ] - }, - "execution_count": 73, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 76, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.isEmpty()" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.peek()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Balanced Parentheses Check .ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Balanced Parentheses Check .ipynb deleted file mode 100644 index 40a0f8e4..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Balanced Parentheses Check .ipynb +++ /dev/null @@ -1,169 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Balanced Parentheses Check \n", - "\n", - "## Problem Statement\n", - "\n", - "Given a string of opening and closing parentheses, check whether it’s balanced. We have 3 types of parentheses: round brackets: (), square brackets: [], and curly brackets: {}. Assume that the string doesn’t contain any other character than these, no spaces words or numbers. As a reminder, balanced parentheses require every opening parenthesis to be closed in the reverse order opened. For example ‘([])’ is balanced but ‘([)]’ is not. \n", - "\n", - "\n", - "You can assume the input string has no spaces.\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def balance_check(s):\n", - " chars = []\n", - " matches = {')':'(',']':'[','}':'{'}\n", - " for c in s:\n", - " if c in matches:\n", - " if chars.pop() != matches[c]:\n", - " return False\n", - " else:\n", - " chars.append(c)\n", - " return chars == [] \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('[]')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('[](){([[[]]])}')" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('()(){]}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestBalanceCheck(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol('[](){([[[]]])}('),False)\n", - " assert_equal(sol('[{{{(())}}}]((()))'),True)\n", - " assert_equal(sol('[[[]])]'),False)\n", - " print ('ALL TEST CASES PASSED')\n", - " \n", - "# Run Tests\n", - "\n", - "t = TestBalanceCheck()\n", - "t.test(balance_check)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Deque .ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Deque .ipynb deleted file mode 100644 index 2fd35590..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Deque .ipynb +++ /dev/null @@ -1,206 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Deque \n", - "\n", - "Finally, implement a Deque class! It should be able to do the following:\n", - "\n", - "* Check if its empty\n", - "* Add to both front and rear\n", - "* Remove from Front and Rear\n", - "* Check the Size" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "class Deque(object):\n", - " def __init__(self):\n", - " self.items = []\n", - " def is_empty(self):\n", - " return self.items == []\n", - " def add_front(self, e):\n", - " self.items.insert(0, e)\n", - " def add_rear(self, e):\n", - " self.items.append(e)\n", - " def remove_front(self):\n", - " return self.items.pop(0)\n", - " def remove_rear(self):\n", - " return self.items.pop()\n", - " def size(self):\n", - " return len(self.items)\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "deq = Deque()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deq.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "deq.add_front(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "deq.add_front(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "deq.add_rear(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deq.remove_front()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deq.remove_rear()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deq.remove_rear()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deq.is_empty()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Queue -Using Two Stacks .ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Queue -Using Two Stacks .ipynb deleted file mode 100644 index 521c8245..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Queue -Using Two Stacks .ipynb +++ /dev/null @@ -1,131 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Queue - Using Two Stacks\n", - "\n", - "Given the Stack class below, implement a Queue class using **two** stacks! Note, this is a \"classic\" interview problem. Use a Python list data structure as your Stack." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Uses lists instead of your own Stack class.\n", - "stack1 = []\n", - "stack2 = []" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "class Queue2Stacks(object):\n", - " \n", - " def __init__(self):\n", - " \n", - " # Two Stacks\n", - " self.in_stack = []\n", - " self.out_stack = []\n", - " \n", - " def enqueue(self, element):\n", - " # FILL OUT CODE HERE\n", - " self.in_stack.append(element)\n", - " pass\n", - " \n", - " def dequeue(self):\n", - " \n", - " # FILL OUT CODE HERE\n", - " if not self.out_stack:\n", - " while self.in_stack:\n", - " self.out_stack.append(self.in_stack.pop())\n", - " return self.out_stack.pop()\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "You should be able to tell with your current knowledge of Stacks and Queues if this is working as it should. For example, the following should print as such:" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n", - "4\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO CHECK THAT YOUR SOLUTION OUTPUT MAKES SENSE AND BEHAVES AS A QUEUE\n", - "\"\"\"\n", - "q = Queue2Stacks()\n", - "\n", - "for i in range(5):\n", - " q.enqueue(i)\n", - " \n", - "for i in range(5):\n", - " print (q.dequeue())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Queue.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Queue.ipynb deleted file mode 100644 index 2a758805..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Queue.ipynb +++ /dev/null @@ -1,104 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Queue\n", - "\n", - "It's very common to be asked to implement a Queue class! The class should be able to do the following:\n", - "\n", - "* Check if Queue is Empty\n", - "* Enqueue\n", - "* Dequeue\n", - "* Return the size of the Queue" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "class Queue(object):\n", - " def __init__(self):\n", - " self.items = []\n", - " def is_empty(self):\n", - " return self.items == []\n", - " def enqueue(self, e):\n", - " self.items.insert(0, e)\n", - " def dequeue(self):\n", - " return self.items.pop()\n", - " def size(self):\n", - " return len(self.items)\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1\n", - "two\n", - "3\n" - ] - }, - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q = Queue()\n", - "q.is_empty()\n", - "q.enqueue(1)\n", - "q.enqueue('two')\n", - "q.enqueue(3)\n", - "q.size()\n", - "print(q.dequeue())\n", - "print(q.dequeue())\n", - "print(q.dequeue())\n", - "q.is_empty()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Stack .ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Stack .ipynb deleted file mode 100644 index d0f206c3..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions - PRACTICE/Implement a Stack .ipynb +++ /dev/null @@ -1,228 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Stack \n", - "\n", - "A very common interview question is to begin by just implementing a Stack! Try your best to implement your own stack!\n", - "\n", - "It should have the methods:\n", - "\n", - "* Check if its empty\n", - "* Push a new item\n", - "* Pop an item\n", - "* Peek at the top item\n", - "* Return the size" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "metadata": {}, - "outputs": [], - "source": [ - "class Stack(object):\n", - " # Fill out the Stack Methods here\n", - " def __init__(self):\n", - " self.items = []\n", - " def isEmpty(self):\n", - " return len(self.items) == 0\n", - " def push(self, e):\n", - " self.items.append(e)\n", - " def pop(self):\n", - " return self.items.pop()\n", - " def size(self):\n", - " return len(self.items)\n", - " def peek(self):\n", - " return self.items[self.size()-1] # reuse the size funtion\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [], - "source": [ - "stack = Stack()" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [], - "source": [ - "stack.push(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [], - "source": [ - "stack.push(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [], - "source": [ - "stack.push('Three')" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Three'" - ] - }, - "execution_count": 73, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 76, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.isEmpty()" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stack.peek()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Balanced Parentheses Check - SOLUTION-checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Balanced Parentheses Check - SOLUTION-checkpoint.ipynb deleted file mode 100644 index a4cf7848..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Balanced Parentheses Check - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,212 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Balanced Parentheses Check - SOLUTION\n", - "\n", - "## Problem Statement\n", - "\n", - "Given a string of opening and closing parentheses, check whether it’s balanced. We have 3 types of parentheses: round brackets: (), square brackets: [], and curly brackets: {}. Assume that the string doesn’t contain any other character than these, no spaces words or numbers. As a reminder, balanced parentheses require every opening parenthesis to be closed in the reverse order opened. For example ‘([])’ is balanced but ‘([)]’ is not. \n", - "\n", - "\n", - "You can assume the input string has no spaces.\n", - "\n", - "## Solution\n", - "\n", - "This is a very common interview question and is one of the main ways to check your knowledge of using Stacks! We will start our solution logic as such:\n", - "\n", - "First we will scan the string from left to right, and every time we see an opening parenthesis we push it to a stack, because we want the last opening parenthesis to be closed first. (Remember the FILO structure of a stack!)\n", - "\n", - "Then, when we see a closing parenthesis we check whether the last opened one is the corresponding closing match, by popping an element from the stack. If it’s a valid match, then we proceed forward, if not return false. \n", - "\n", - "Or if the stack is empty we also return false, because there’s no opening parenthesis associated with this closing one. In the end, we also check whether the stack is empty. If so, we return true, otherwise return false because there were some opened parenthesis that were not closed. \n", - "\n", - "Here's an example solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def balance_check(s):\n", - " \n", - " # Check is even number of brackets\n", - " if len(s)%2 != 0:\n", - " return False\n", - " \n", - " # Set of opening brackets\n", - " opening = set('([{') \n", - " \n", - " # Matching Pairs\n", - " matches = set([ ('(',')'), ('[',']'), ('{','}') ]) \n", - " \n", - " # Use a list as a \"Stack\"\n", - " stack = []\n", - " \n", - " # Check every parenthesis in string\n", - " for paren in s:\n", - " \n", - " # If its an opening, append it to list\n", - " if paren in opening:\n", - " stack.append(paren)\n", - " \n", - " else:\n", - " \n", - " # Check that there are parentheses in Stack\n", - " if len(stack) == 0:\n", - " return False\n", - " \n", - " # Check the last open parenthesis\n", - " last_open = stack.pop()\n", - " \n", - " # Check if it has a closing match\n", - " if (last_open,paren) not in matches:\n", - " return False\n", - " \n", - " return len(stack) == 0" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('[]')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('[](){([[[]]])}')" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('()(){]}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestBalanceCheck(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol('[](){([[[]]])}('),False)\n", - " assert_equal(sol('[{{{(())}}}]((()))'),True)\n", - " assert_equal(sol('[[[]])]'),False)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run Tests\n", - "\n", - "t = TestBalanceCheck()\n", - "t.test(balance_check)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Deque - SOLUTION-checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Deque - SOLUTION-checkpoint.ipynb deleted file mode 100644 index af87180e..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Deque - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,65 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Deque - SOLUTION\n", - "\n", - "**Please refer to the Implementation of Deque lecture for a full explanation. The code from that lecture is below:**" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Deque:\n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def addFront(self, item):\n", - " self.items.append(item)\n", - "\n", - " def addRear(self, item):\n", - " self.items.insert(0,item)\n", - "\n", - " def removeFront(self):\n", - " return self.items.pop()\n", - "\n", - " def removeRear(self):\n", - " return self.items.pop(0)\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Queue - SOLUTION-checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Queue - SOLUTION-checkpoint.ipynb deleted file mode 100644 index a400bb3d..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Queue - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,59 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Queue - SOLUTION\n", - "\n", - "**Please refer to the Implementation of Queue lecture for a full explanation. The code from that lecture is below:**" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Queue:\n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def enqueue(self, item):\n", - " self.items.insert(0,item)\n", - "\n", - " def dequeue(self):\n", - " return self.items.pop()\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Queue -Using Two Stacks - SOLUTION-checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Queue -Using Two Stacks - SOLUTION-checkpoint.ipynb deleted file mode 100644 index e66de679..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Queue -Using Two Stacks - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,134 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Queue - Using Two Stacks - SOLUTION\n", - "\n", - "Given the Stack class below, implement a Queue class using **two** stacks! Note, this is a \"classic\" interview problem. Use a Python list data structure as your Stack." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "stack1 = []\n", - "stack2 = []" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "The key insight is that a stack reverses order (while a queue doesn't). A sequence of elements pushed on a stack comes back in reversed order when popped. Consequently, two stacks chained together will return elements in the same order, since reversed order reversed again is original order.\n", - "\n", - " We use an in-stack that we fill when an element is enqueued and the dequeue operation takes elements from an out-stack. If the out-stack is empty we pop all elements from the in-stack and push them onto the out-stack. " - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Queue2Stacks(object):\n", - " \n", - " def __init__(self):\n", - " \n", - " # Two Stacks\n", - " self.instack = []\n", - " self.outstack = []\n", - " \n", - " def enqueue(self,element):\n", - " \n", - " # Add an enqueue with the \"IN\" stack\n", - " self.instack.append(element)\n", - " \n", - " def dequeue(self):\n", - " if not self.outstack:\n", - " while self.instack:\n", - " # Add the elements to the outstack to reverse the order when called\n", - " self.outstack.append(self.instack.pop())\n", - " return self.outstack.pop() " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "You should be able to tell with your current knowledge of Stacks and Queues if this is working as it should. For example, the following should print as such:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n", - "4\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO CHECK THAT YOUR SOLUTION OUTPUT MAKES SENSE AND BEHAVES AS A QUEUE\n", - "\"\"\"\n", - "q = Queue2Stacks()\n", - "\n", - "for i in xrange(5):\n", - " q.enqueue(i)\n", - " \n", - "for i in xrange(5):\n", - " print q.dequeue()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Stack - SOLUTION-checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Stack - SOLUTION-checkpoint.ipynb deleted file mode 100644 index cb9fd690..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/.ipynb_checkpoints/Implement a Stack - SOLUTION-checkpoint.ipynb +++ /dev/null @@ -1,63 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Stack -SOLUTION\n", - "\n", - "**Please refer to the lecture on implementation for a full explanation. Here is the code from that lecture:**" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Stack(object):\n", - " \n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def push(self, item):\n", - " self.items.append(item)\n", - "\n", - " def pop(self):\n", - " return self.items.pop()\n", - "\n", - " def peek(self):\n", - " return self.items[len(self.items)-1]\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Balanced Parentheses Check - SOLUTION.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Balanced Parentheses Check - SOLUTION.ipynb deleted file mode 100644 index 2c988d8f..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Balanced Parentheses Check - SOLUTION.ipynb +++ /dev/null @@ -1,204 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Balanced Parentheses Check - SOLUTION\n", - "\n", - "## Problem Statement\n", - "\n", - "Given a string of opening and closing parentheses, check whether it’s balanced. We have 3 types of parentheses: round brackets: (), square brackets: [], and curly brackets: {}. Assume that the string doesn’t contain any other character than these, no spaces words or numbers. As a reminder, balanced parentheses require every opening parenthesis to be closed in the reverse order opened. For example ‘([])’ is balanced but ‘([)]’ is not. \n", - "\n", - "\n", - "You can assume the input string has no spaces.\n", - "\n", - "## Solution\n", - "\n", - "This is a very common interview question and is one of the main ways to check your knowledge of using Stacks! We will start our solution logic as such:\n", - "\n", - "First we will scan the string from left to right, and every time we see an opening parenthesis we push it to a stack, because we want the last opening parenthesis to be closed first. (Remember the FILO structure of a stack!)\n", - "\n", - "Then, when we see a closing parenthesis we check whether the last opened one is the corresponding closing match, by popping an element from the stack. If it’s a valid match, then we proceed forward, if not return false. \n", - "\n", - "Or if the stack is empty we also return false, because there’s no opening parenthesis associated with this closing one. In the end, we also check whether the stack is empty. If so, we return true, otherwise return false because there were some opened parenthesis that were not closed. \n", - "\n", - "Here's an example solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def balance_check(s):\n", - " \n", - " # Check is even number of brackets\n", - " if len(s)%2 != 0:\n", - " return False\n", - " \n", - " # Set of opening brackets\n", - " opening = set('([{') \n", - " \n", - " # Matching Pairs\n", - " matches = set([ ('(',')'), ('[',']'), ('{','}') ]) \n", - " \n", - " # Use a list as a \"Stack\"\n", - " stack = []\n", - " \n", - " # Check every parenthesis in string\n", - " for paren in s:\n", - " \n", - " # If its an opening, append it to list\n", - " if paren in opening:\n", - " stack.append(paren)\n", - " \n", - " else:\n", - " \n", - " # Check that there are parentheses in Stack\n", - " if len(stack) == 0:\n", - " return False\n", - " \n", - " # Check the last open parenthesis\n", - " last_open = stack.pop()\n", - " \n", - " # Check if it has a closing match\n", - " if (last_open,paren) not in matches:\n", - " return False\n", - " \n", - " return len(stack) == 0" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('[]')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('[](){([[[]]])}')" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('()(){]}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestBalanceCheck(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol('[](){([[[]]])}('),False)\n", - " assert_equal(sol('[{{{(())}}}]((()))'),True)\n", - " assert_equal(sol('[[[]])]'),False)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run Tests\n", - "\n", - "t = TestBalanceCheck()\n", - "t.test(balance_check)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Deque - SOLUTION.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Deque - SOLUTION.ipynb deleted file mode 100644 index a876e02b..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Deque - SOLUTION.ipynb +++ /dev/null @@ -1,65 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Deque - SOLUTION\n", - "\n", - "**Please refer to the Implementation of Deque lecture for a full explanation. The code from that lecture is below:**" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Deque:\n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def addFront(self, item):\n", - " self.items.append(item)\n", - "\n", - " def addRear(self, item):\n", - " self.items.insert(0,item)\n", - "\n", - " def removeFront(self):\n", - " return self.items.pop()\n", - "\n", - " def removeRear(self):\n", - " return self.items.pop(0)\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Queue - SOLUTION.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Queue - SOLUTION.ipynb deleted file mode 100644 index 0a2f2cdd..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Queue - SOLUTION.ipynb +++ /dev/null @@ -1,59 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Queue - SOLUTION\n", - "\n", - "**Please refer to the Implementation of Queue lecture for a full explanation. The code from that lecture is below:**" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Queue:\n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def enqueue(self, item):\n", - " self.items.insert(0,item)\n", - "\n", - " def dequeue(self):\n", - " return self.items.pop()\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Queue -Using Two Stacks - SOLUTION.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Queue -Using Two Stacks - SOLUTION.ipynb deleted file mode 100644 index 74ca5fee..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Queue -Using Two Stacks - SOLUTION.ipynb +++ /dev/null @@ -1,132 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Queue - Using Two Stacks - SOLUTION\n", - "\n", - "Given the Stack class below, implement a Queue class using **two** stacks! Note, this is a \"classic\" interview problem. Use a Python list data structure as your Stack." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "stack1 = []\n", - "stack2 = []" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "The key insight is that a stack reverses order (while a queue doesn't). A sequence of elements pushed on a stack comes back in reversed order when popped. Consequently, two stacks chained together will return elements in the same order, since reversed order reversed again is original order.\n", - "\n", - " We use an in-stack that we fill when an element is enqueued and the dequeue operation takes elements from an out-stack. If the out-stack is empty we pop all elements from the in-stack and push them onto the out-stack. " - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Queue2Stacks(object):\n", - " \n", - " def __init__(self):\n", - " \n", - " # Two Stacks\n", - " self.instack = []\n", - " self.outstack = []\n", - " \n", - " def enqueue(self,element):\n", - " \n", - " # Add an enqueue with the \"IN\" stack\n", - " self.instack.append(element)\n", - " \n", - " def dequeue(self):\n", - " if not self.outstack:\n", - " while self.instack:\n", - " # Add the elements to the outstack to reverse the order when called\n", - " self.outstack.append(self.instack.pop())\n", - " return self.outstack.pop() " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "You should be able to tell with your current knowledge of Stacks and Queues if this is working as it should. For example, the following should print as such:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n", - "4\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO CHECK THAT YOUR SOLUTION OUTPUT MAKES SENSE AND BEHAVES AS A QUEUE\n", - "\"\"\"\n", - "q = Queue2Stacks()\n", - "\n", - "for i in xrange(5):\n", - " q.enqueue(i)\n", - " \n", - "for i in xrange(5):\n", - " print q.dequeue()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Stack - SOLUTION.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Stack - SOLUTION.ipynb deleted file mode 100644 index 72f8e3ca..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions -SOLUTIONS/Implement a Stack - SOLUTION.ipynb +++ /dev/null @@ -1,63 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Stack -SOLUTION\n", - "\n", - "**Please refer to the lecture on implementation for a full explanation. Here is the code from that lecture:**" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Stack(object):\n", - " \n", - " def __init__(self):\n", - " self.items = []\n", - "\n", - " def isEmpty(self):\n", - " return self.items == []\n", - "\n", - " def push(self, item):\n", - " self.items.append(item)\n", - "\n", - " def pop(self):\n", - " return self.items.pop()\n", - "\n", - " def peek(self):\n", - " return self.items[len(self.items)-1]\n", - "\n", - " def size(self):\n", - " return len(self.items)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Balanced Parentheses Check -checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Balanced Parentheses Check -checkpoint.ipynb deleted file mode 100644 index 274f3ace..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Balanced Parentheses Check -checkpoint.ipynb +++ /dev/null @@ -1,171 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Balanced Parentheses Check \n", - "\n", - "## Problem Statement\n", - "\n", - "Given a string of opening and closing parentheses, check whether it’s balanced. We have 3 types of parentheses: round brackets: (), square brackets: [], and curly brackets: {}. Assume that the string doesn’t contain any other character than these, no spaces words or numbers. As a reminder, balanced parentheses require every opening parenthesis to be closed in the reverse order opened. For example ‘([])’ is balanced but ‘([)]’ is not. \n", - "\n", - "\n", - "You can assume the input string has no spaces.\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def balance_check(s):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('[]')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('[](){([[[]]])}')" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('()(){]}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestBalanceCheck(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol('[](){([[[]]])}('),False)\n", - " assert_equal(sol('[{{{(())}}}]((()))'),True)\n", - " assert_equal(sol('[[[]])]'),False)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run Tests\n", - "\n", - "t = TestBalanceCheck()\n", - "t.test(balance_check)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Deque -checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Deque -checkpoint.ipynb deleted file mode 100644 index d5c255f7..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Deque -checkpoint.ipynb +++ /dev/null @@ -1,51 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Deque \n", - "\n", - "Finally, implement a Deque class! It should be able to do the following:\n", - "\n", - "* Check if its empty\n", - "* Add to both front and rear\n", - "* Remove from Front and Rear\n", - "* Check the Size" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Deque(object):\n", - " pass" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Queue -Using Two Stacks -checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Queue -Using Two Stacks -checkpoint.ipynb deleted file mode 100644 index 907956a6..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Queue -Using Two Stacks -checkpoint.ipynb +++ /dev/null @@ -1,131 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Queue - Using Two Stacks\n", - "\n", - "Given the Stack class below, implement a Queue class using **two** stacks! Note, this is a \"classic\" interview problem. Use a Python list data structure as your Stack." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Uses lists instead of your own Stack class.\n", - "stack1 = []\n", - "stack2 = []" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Queue2Stacks(object):\n", - " \n", - " def __init__(self):\n", - " \n", - " # Two Stacks\n", - " self.stack1 = []\n", - " self.stack2 = []\n", - " \n", - " def enqueue(self,element):\n", - " \n", - " # FILL OUT CODE HERE\n", - " pass\n", - " \n", - " def dequeue(self):\n", - " \n", - " # FILL OUT CODE HERE\n", - " pass " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "You should be able to tell with your current knowledge of Stacks and Queues if this is working as it should. For example, the following should print as such:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n", - "4\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO CHECK THAT YOUR SOLUTION OUTPUT MAKES SENSE AND BEHAVES AS A QUEUE\n", - "\"\"\"\n", - "q = Queue2Stacks()\n", - "\n", - "for i in xrange(5):\n", - " q.enqueue(i)\n", - " \n", - "for i in xrange(5):\n", - " print q.dequeue()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Queue-checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Queue-checkpoint.ipynb deleted file mode 100644 index a5ac0019..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Queue-checkpoint.ipynb +++ /dev/null @@ -1,51 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Queue\n", - "\n", - "It's very common to be asked to implement a Queue class! The class should be able to do the following:\n", - "\n", - "* Check if Queue is Empty\n", - "* Enqueue\n", - "* Dequeue\n", - "* Return the size of the Queue" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Queue(object):\n", - " pass" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Stack -checkpoint.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Stack -checkpoint.ipynb deleted file mode 100644 index 6dea3952..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /.ipynb_checkpoints/Implement a Stack -checkpoint.ipynb +++ /dev/null @@ -1,57 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Stack \n", - "\n", - "A very common interview question is to begin by just implementing a Stack! Try your best to implement your own stack!\n", - "\n", - "It should have the methods:\n", - "\n", - "* Check if its empty\n", - "* Push a new item\n", - "* Pop an item\n", - "* Peek at the top item\n", - "* Return the size" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Stack(object):\n", - " \n", - " \n", - " # Fill out the Stack Methods here\n", - " pass" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Balanced Parentheses Check .ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Balanced Parentheses Check .ipynb deleted file mode 100644 index 274f3ace..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Balanced Parentheses Check .ipynb +++ /dev/null @@ -1,171 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Balanced Parentheses Check \n", - "\n", - "## Problem Statement\n", - "\n", - "Given a string of opening and closing parentheses, check whether it’s balanced. We have 3 types of parentheses: round brackets: (), square brackets: [], and curly brackets: {}. Assume that the string doesn’t contain any other character than these, no spaces words or numbers. As a reminder, balanced parentheses require every opening parenthesis to be closed in the reverse order opened. For example ‘([])’ is balanced but ‘([)]’ is not. \n", - "\n", - "\n", - "You can assume the input string has no spaces.\n", - "\n", - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def balance_check(s):\n", - " \n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('[]')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('[](){([[[]]])}')" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "balance_check('()(){]}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ALL TEST CASES PASSED\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO TEST YOUR SOLUTION\n", - "\"\"\"\n", - "from nose.tools import assert_equal\n", - "\n", - "class TestBalanceCheck(object):\n", - " \n", - " def test(self,sol):\n", - " assert_equal(sol('[](){([[[]]])}('),False)\n", - " assert_equal(sol('[{{{(())}}}]((()))'),True)\n", - " assert_equal(sol('[[[]])]'),False)\n", - " print 'ALL TEST CASES PASSED'\n", - " \n", - "# Run Tests\n", - "\n", - "t = TestBalanceCheck()\n", - "t.test(balance_check)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Deque .ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Deque .ipynb deleted file mode 100644 index d5c255f7..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Deque .ipynb +++ /dev/null @@ -1,51 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Deque \n", - "\n", - "Finally, implement a Deque class! It should be able to do the following:\n", - "\n", - "* Check if its empty\n", - "* Add to both front and rear\n", - "* Remove from Front and Rear\n", - "* Check the Size" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Deque(object):\n", - " pass" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Queue -Using Two Stacks .ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Queue -Using Two Stacks .ipynb deleted file mode 100644 index 907956a6..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Queue -Using Two Stacks .ipynb +++ /dev/null @@ -1,131 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Queue - Using Two Stacks\n", - "\n", - "Given the Stack class below, implement a Queue class using **two** stacks! Note, this is a \"classic\" interview problem. Use a Python list data structure as your Stack." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Uses lists instead of your own Stack class.\n", - "stack1 = []\n", - "stack2 = []" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Solution\n", - "\n", - "Fill out your solution below:" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Queue2Stacks(object):\n", - " \n", - " def __init__(self):\n", - " \n", - " # Two Stacks\n", - " self.stack1 = []\n", - " self.stack2 = []\n", - " \n", - " def enqueue(self,element):\n", - " \n", - " # FILL OUT CODE HERE\n", - " pass\n", - " \n", - " def dequeue(self):\n", - " \n", - " # FILL OUT CODE HERE\n", - " pass " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test Your Solution\n", - "\n", - "You should be able to tell with your current knowledge of Stacks and Queues if this is working as it should. For example, the following should print as such:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "1\n", - "2\n", - "3\n", - "4\n" - ] - } - ], - "source": [ - "\"\"\"\n", - "RUN THIS CELL TO CHECK THAT YOUR SOLUTION OUTPUT MAKES SENSE AND BEHAVES AS A QUEUE\n", - "\"\"\"\n", - "q = Queue2Stacks()\n", - "\n", - "for i in xrange(5):\n", - " q.enqueue(i)\n", - " \n", - "for i in xrange(5):\n", - " print q.dequeue()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Good Job!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Queue.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Queue.ipynb deleted file mode 100644 index a5ac0019..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Queue.ipynb +++ /dev/null @@ -1,51 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Queue\n", - "\n", - "It's very common to be asked to implement a Queue class! The class should be able to do the following:\n", - "\n", - "* Check if Queue is Empty\n", - "* Enqueue\n", - "* Dequeue\n", - "* Return the size of the Queue" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Queue(object):\n", - " pass" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Stack .ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Stack .ipynb deleted file mode 100644 index 6dea3952..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Interview Problems/Stacks, Queues, Deques Interview Questions /Implement a Stack .ipynb +++ /dev/null @@ -1,57 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implement a Stack \n", - "\n", - "A very common interview question is to begin by just implementing a Stack! Try your best to implement your own stack!\n", - "\n", - "It should have the methods:\n", - "\n", - "* Check if its empty\n", - "* Push a new item\n", - "* Pop an item\n", - "* Peek at the top item\n", - "* Return the size" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Stack(object):\n", - " \n", - " \n", - " # Fill out the Stack Methods here\n", - " pass" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Stacks, Queues and Deques/Stacks, Queues, and Deques Overview.ipynb b/Stacks, Queues and Deques/Stacks, Queues, and Deques Overview.ipynb deleted file mode 100644 index e020c9b7..00000000 --- a/Stacks, Queues and Deques/Stacks, Queues, and Deques Overview.ipynb +++ /dev/null @@ -1,53 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Stacks, Queues, and Deques Overview" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this section of the course we will be learning about Stack, Queues, and Deques. These are linear structures. They are similar to arrays, but each of these structures differs by how it adds and removes items.\n", - "\n", - "Here's what to expect in this section:\n", - "\n", - " 1.) A Brief Overview of the Linear Structures\n", - " 2.) An Overview of Stacks\n", - " 3.) An Implementation of a Stack class\n", - " 4.) An Overview of Queues\n", - " 5.) An Implementation of a Queue class\n", - " 6.) An Overview of Deques\n", - " 7.) An Implementation of a Deque class\n", - " \n", - " Then finally a variety of interview questions based on Stacks, Queues, and Deques!\n", - " \n", - "**See the lecture video for a complete breakdown of this Section of the course!**" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -}