From 73dd64f96d0389331c8c499f765a5db4906c63fc Mon Sep 17 00:00:00 2001 From: Yangshun Date: Wed, 6 Apr 2022 09:47:25 +0800 Subject: [PATCH] contents: rearrange algo layout structure --- contents/algorithms/__template__.md | 10 +++--- contents/algorithms/array.md | 24 +++++++------- contents/algorithms/binary.md | 20 ++++++------ contents/algorithms/graph.md | 30 +++++++++--------- contents/algorithms/hash-table.md | 16 +++++----- contents/algorithms/heap.md | 12 +++---- contents/algorithms/interval.md | 14 ++++++--- contents/algorithms/introduction.md | 2 +- contents/algorithms/linked-list.md | 24 +++++++------- contents/algorithms/queue.md | 18 +++++------ contents/algorithms/recursion.md | 14 ++++----- contents/algorithms/sorting-searching.md | 40 ++++++++++++------------ contents/algorithms/stack.md | 14 ++++----- contents/algorithms/string.md | 8 ++--- contents/algorithms/tree.md | 28 ++++++++--------- contents/algorithms/trie.md | 16 +++++----- 16 files changed, 147 insertions(+), 143 deletions(-) diff --git a/contents/algorithms/__template__.md b/contents/algorithms/__template__.md index baebbb7f..77732d8f 100644 --- a/contents/algorithms/__template__.md +++ b/contents/algorithms/__template__.md @@ -23,6 +23,10 @@ TODO +## Learning resources + +TODO + ## Implementations | Language | API | @@ -43,7 +47,7 @@ TODO | Insert | O(1) | | | Remove | O(1) | | -## Learning resources +## Things to look out for during interviews TODO @@ -51,10 +55,6 @@ TODO TODO -## Things to look out for during interviews - -TODO - ## Techniques TODO diff --git a/contents/algorithms/array.md b/contents/algorithms/array.md index 13726809..e42f745b 100644 --- a/contents/algorithms/array.md +++ b/contents/algorithms/array.md @@ -20,7 +20,14 @@ Arrays are among the most common data structures encountered during interviews. - Addition and removal of elements into/from the middle an array is slow because they remaining elements need to be shifted to accommodate the new/missing element. An exception to this is if the position to be inserted/removed is at the end of the array. - For certain languages where the array size is fixed, it cannot alter its size after initialization. if an insertion causes the total number of elements to exceed the size, a new array has to be allocated and the existing elements have to be copied over. The act of creating a new array and transferring elements over takes O(n) time. -**Definitions** +## Learning resources + +- Readings + - [Array in Data Structure: What is, Arrays Operations](https://www.guru99.com/array-data-structure.html), Guru99 +- Videos + - [Arrays](https://www.coursera.org/lecture/data-structures/arrays-OsBSF), University of California San Diego + +## Common terms Common terms you see when doing problems involving arrays: @@ -41,12 +48,11 @@ Common terms you see when doing problems involving arrays: | Remove | O(n) | Removal would require shifting all the subsequent elements to the left by one and that takes O(n) | | Remove (at the end) | O(1) | Special case of removal where no other element needs to be shifted | -## Learning resources +## Things to look out for during interviews -- Readings - - [Array in Data Structure: What is, Arrays Operations](https://www.guru99.com/array-data-structure.html), Guru99 -- Videos - - [Arrays](https://www.coursera.org/lecture/data-structures/arrays-OsBSF), University of California San Diego +- Clarify if there are duplicate values in the array. Would the presence of duplicate values affect the answer? Does it make the question simpler or harder? +- When using an index to iterate through array elements, be careful not to go out of bounds. +- Be mindful about slicing or concatenating arrays in your code. Typically, slicing and concatenating arrays would take O(n) time. Use start and end indices to demarcate a subarray/range where possible. ## Corner cases @@ -55,12 +61,6 @@ Common terms you see when doing problems involving arrays: - Sequence with repeated elements - Duplicated values in the sequence -## Things to look out for during interviews - -- Clarify if there are duplicate values in the array. Would the presence of duplicate values affect the answer? Does it make the question simpler or harder? -- When using an index to iterate through array elements, be careful not to go out of bounds. -- Be mindful about slicing or concatenating arrays in your code. Typically, slicing and concatenating arrays would take O(n) time. Use start and end indices to demarcate a subarray/range where possible. - ## Techniques Note that because both arrays and strings are sequences (a string is an array of characters), most of the techniques here will apply to string problems. diff --git a/contents/algorithms/binary.md b/contents/algorithms/binary.md index 809512b7..42e0d7fc 100644 --- a/contents/algorithms/binary.md +++ b/contents/algorithms/binary.md @@ -8,6 +8,16 @@ toc_max_heading_level: 2 Knowledge of binary number system and bit manipulation is less important in coding interviews as most Software Engineers do not have to deal with bits, which is more commonly used when dealing with lower level systems and programming languages. They are still asked sometimes, so you should at least still know how to convert a number from decimal form into binary form, and vice versa, in your chosen programming language. +## Learning resources + +- Readings + - [Bits, Bytes, Building With Binary](https://medium.com/basecs/bits-bytes-building-with-binary-13cb4289aafa), basecs + - [Bitwise operation](https://en.wikipedia.org/wiki/Bitwise_operation), Wikipedia +- Videos + - [Algorithms: Bit Manipulation](https://www.youtube.com/watch?v=NLKQEOgBAnw), HackerRank +- Practice + - [Practice with bit operations](https://pconrad.github.io/old_pconrad_cs16/topics/bitOps/) + ## Corner cases - Be aware and check for overflow/underflow @@ -30,16 +40,6 @@ Some helpful utility snippets: | Check if a number is a power of 2 | `(num & num - 1) == 0` or `(num & (-num)) == num` | | Swapping two variables | `num1 ^= num2; num2 ^= num1; num1 ^= num2` | -## Learning resources - -- Readings - - [Bits, Bytes, Building With Binary](https://medium.com/basecs/bits-bytes-building-with-binary-13cb4289aafa), basecs - - [Bitwise operation](https://en.wikipedia.org/wiki/Bitwise_operation), Wikipedia -- Videos - - [Algorithms: Bit Manipulation](https://www.youtube.com/watch?v=NLKQEOgBAnw), HackerRank -- Practice - - [Practice with bit operations](https://pconrad.github.io/old_pconrad_cs16/topics/bitOps/) - ## Recommended questions - [Sum of Two Integers](https://leetcode.com/problems/sum-of-two-integers/) diff --git a/contents/algorithms/graph.md b/contents/algorithms/graph.md index 5a87b9bd..163d15c0 100644 --- a/contents/algorithms/graph.md +++ b/contents/algorithms/graph.md @@ -15,9 +15,19 @@ Graphs are commonly used to model relationship between unordered entities, such Be familiar with the various graph representations, graph search algorithms and their time and space complexities. -**Graph representations** +## Learning resources -You can be given a list of edges and tasked to build your own graph from the edges to perform a traversal on. The common graph representations are: +- Readings + - [From Theory To Practice: Representing Graphs](https://medium.com/basecs/from-theory-to-practice-representing-graphs-cfd782c5be38), basecs + - [Deep Dive Through A Graph: DFS Traversal](https://medium.com/basecs/deep-dive-through-a-graph-dfs-traversal-8177df5d0f13), basecs + - [Going Broad In A Graph: BFS Traversal](https://medium.com/basecs/going-broad-in-a-graph-bfs-traversal-959bd1a09255), basecs +- Additional (only if you have time) + - [Finding The Shortest Path, With A Little Help From Dijkstra](https://medium.com/basecs/finding-the-shortest-path-with-a-little-help-from-dijkstra-613149fbdc8e), basecs + - [Spinning Around In Cycles With Directed Acyclic Graphs](https://medium.com/basecs/spinning-around-in-cycles-with-directed-acyclic-graphs-a233496d4688), basecs + +## Graph representations + +You can be given a list of edges and you have to build your own graph from the edges so that you can perform a traversal on. them The common graph representations are: - Adjacency matrix - Adjacency list @@ -37,15 +47,10 @@ In algorithm interviews, graphs are commonly given in the input as 2D matrices w | Breadth-first search | O(|V| + O|E|) | | Topological sort | O(|V| + O|E|) | -## Learning resources +## Things to look out for during interviews -- Readings - - [From Theory To Practice: Representing Graphs](https://medium.com/basecs/from-theory-to-practice-representing-graphs-cfd782c5be38), basecs - - [Deep Dive Through A Graph: DFS Traversal](https://medium.com/basecs/deep-dive-through-a-graph-dfs-traversal-8177df5d0f13), basecs - - [Going Broad In A Graph: BFS Traversal](https://medium.com/basecs/going-broad-in-a-graph-bfs-traversal-959bd1a09255), basecs -- Additional (only if you have time) - - [Finding The Shortest Path, With A Little Help From Dijkstra](https://medium.com/basecs/finding-the-shortest-path-with-a-little-help-from-dijkstra-613149fbdc8e), basecs - - [Spinning Around In Cycles With Directed Acyclic Graphs](https://medium.com/basecs/spinning-around-in-cycles-with-directed-acyclic-graphs-a233496d4688), basecs +- A tree-like diagram could very well be a graph that allows for cycles and a naive recursive solution would not work. In that case you will have to handle cycles and keep a set of visited nodes when traversing. +- Ensure you are correctly keeping track of visited nodes and not visiting each node more than once. Otherwise your code could end up in an infinite loop. ## Corner cases @@ -54,11 +59,6 @@ In algorithm interviews, graphs are commonly given in the input as 2D matrices w - Disjoint graphs - Graph with cycles -## Things to look out for during interviews - -- A tree-like diagram could very well be a graph that allows for cycles and a naive recursive solution would not work. In that case you will have to handle cycles and keep a set of visited nodes when traversing. -- Ensure you are correctly keeping track of visited nodes and not visiting each node more than once. Otherwise your code could end up in an infinite loop. - ## Graph search algorithms - **Common** - Breadth-first Search, Depth-first Search diff --git a/contents/algorithms/hash-table.md b/contents/algorithms/hash-table.md index de891e34..a491cad0 100644 --- a/contents/algorithms/hash-table.md +++ b/contents/algorithms/hash-table.md @@ -15,6 +15,14 @@ In the case of hash collisions, there are a number of collision resolution techn - **Separate chaining** - A linked list is used for each value, so that it stores all the collided items. - **Open addressing** - All entry records are stored in the bucket array itself. When a new entry has to be inserted, the buckets are examined, starting with the hashed-to slot and proceeding in some probe sequence, until an unoccupied slot is found +## Learning resources + +- Readings + - [Taking Hash Tables Off The Shelf](https://medium.com/basecs/taking-hash-tables-off-the-shelf-139cbf4752f0), basecs + - [Hashing Out Hash Functions](https://medium.com/basecs/hashing-out-hash-functions-ea5dd8beb4dd), basecs +- Videos + - [Core: Hash Tables](https://www.coursera.org/lecture/data-structures-optimizing-performance/core-hash-tables-m7UuP), University of California San Diego + ## Implementations | Language | API | @@ -35,14 +43,6 @@ In the case of hash collisions, there are a number of collision resolution techn _\* This is the average case, but in interviews we only care about the average case for hash tables._ -## Learning resources - -- Readings - - [Taking Hash Tables Off The Shelf](https://medium.com/basecs/taking-hash-tables-off-the-shelf-139cbf4752f0), basecs - - [Hashing Out Hash Functions](https://medium.com/basecs/hashing-out-hash-functions-ea5dd8beb4dd), basecs -- Videos - - [Core: Hash Tables](https://www.coursera.org/lecture/data-structures-optimizing-performance/core-hash-tables-m7UuP), University of California San Diego - ## Sample questions - Describe an implementation of a least-used cache, and big-O notation of it. diff --git a/contents/algorithms/heap.md b/contents/algorithms/heap.md index 2d6f9242..a7f0440e 100644 --- a/contents/algorithms/heap.md +++ b/contents/algorithms/heap.md @@ -13,6 +13,12 @@ A heap is a specialized tree-based data structure which is a complete tree that In the context of algorithm interviews, heaps and priority queues can be treated as the same data structure. A heap is a useful data structure when it is necessary to repeatedly remove the object with the highest (or lowest) priority, or when insertions need to be interspersed with removals of the root node. +## Learning resources + +- [Learning to Love Heaps](https://medium.com/basecs/learning-to-love-heaps-cef2b273a238), basecs +- [Heapify All The Things With Heap Sort](https://medium.com/basecs/heapify-all-the-things-with-heap-sort-55ee1c93af82), basecs +- [Heaps](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#heaps), James Aspnes, Yale University + ## Implementations | Language | API | @@ -31,12 +37,6 @@ In the context of algorithm interviews, heaps and priority queues can be treated | Remove | O(log(n)) | | Heapify (create a heap out of given array of elements) | O(n) | -## Learning resources - -- [Learning to Love Heaps](https://medium.com/basecs/learning-to-love-heaps-cef2b273a238), basecs -- [Heapify All The Things With Heap Sort](https://medium.com/basecs/heapify-all-the-things-with-heap-sort-55ee1c93af82), basecs -- [Heaps](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#heaps), James Aspnes, Yale University - ## Techniques ### Mention of `k` diff --git a/contents/algorithms/interval.md b/contents/algorithms/interval.md index 0eec67d7..bd18f0a0 100644 --- a/contents/algorithms/interval.md +++ b/contents/algorithms/interval.md @@ -12,16 +12,20 @@ An example interval array: `[[1, 2], [4, 7]]`. Interval questions can be tricky to those who have not tried them before because of the sheer number of cases to consider when they overlap. +## Things to look out for during interviews + +- Clarify with the interviewer whether `[1, 2]` and `[2, 3]` are considered overlapping intervals as it affects how you will write your equality checks. +- Clarify whether an interval of `[a, b]` will strictly follow `a` < `b` (`a` is smaller than `b`) + ## Corner cases +- No intervals - Single interval +- Two intervals - Non-overlapping intervals - An interval totally consumed within another interval -- Duplicate intervals - -## Things to look out for during interviews - -- Do clarify with the interviewer whether `[1, 2]` and `[2, 3]` are considered overlapping intervals as it affects how you will write your equality checks. +- Duplicate intervals (exactly the same start and end) +- Intervals which start right where another interval ends - `[[1, 2], [2, 3]]` ## Techniques diff --git a/contents/algorithms/introduction.md b/contents/algorithms/introduction.md index c2194a99..4cba24ac 100644 --- a/contents/algorithms/introduction.md +++ b/contents/algorithms/introduction.md @@ -10,7 +10,7 @@ import InDocAd from '../\_components/InDocAd'; This section dives deep into practical knowledge and techniques for algorithms and data structures which appear frequently in algorithm interviews. The more techniques you have in your arsenal, the higher the chances of passing the interview. They may lead you to discover corner cases you might have missed out or even lead you towards the optimal approach! -For each topic, a brief introduction is given, along with language-specific libraries to use, time complexities cheatsheet, corner cases, things to look out for during interviews, useful techniques, and recommended resources to help you master the topic. Lastly, there is a list of recommended common questions to practice which in my opinion is highly valuable for mastering the core concepts for the topic. +For each topic, a brief introduction is given, along with language-specific libraries to use, time complexities cheatsheet, things to look out for during interviews, corner cases, useful techniques, and recommended resources to help you master the topic. Lastly, there is a list of recommended common questions to practice which in my opinion is highly valuable for mastering the core concepts for the topic. If you are interested in how data structures are implemented, check out [Lago](https://github.com/yangshun/lago), a Data Structures and Algorithms library for JavaScript. diff --git a/contents/algorithms/linked-list.md b/contents/algorithms/linked-list.md index 99a36fe5..9b603f63 100644 --- a/contents/algorithms/linked-list.md +++ b/contents/algorithms/linked-list.md @@ -18,6 +18,17 @@ Insertion and deletion of a node in the list (given its location) is O(1) wherea Access time is linear because directly accessing elements by its position in the list is not possible (in arrays you can do `arr[4]` for example). You have to traverse from the start. +## Learning resources + +- Readings + - [What's a Linked List, Anyway? [Part 1]](https://medium.com/basecs/whats-a-linked-list-anyway-part-1-d8b7e6508b9d), basecs + - [What's a Linked List, Anyway? [Part 2]](https://medium.com/basecs/whats-a-linked-list-anyway-part-2-131d96f71996), basecs +- Videos + - [Singly-linked lists](https://www.coursera.org/lecture/data-structures/singly-linked-lists-kHhgK), University of California San Diego + - [Doubly linked lists](https://www.coursera.org/lecture/data-structures/doubly-linked-lists-jpGKD), University of California San Diego + +## Types of linked lists + ### Singly linked list A linked list where each node points to the next node and the last node points to `null`. @@ -28,9 +39,7 @@ A linked list where each node has two pointers, `next` which points to the next ### Circular linked list -A singly linked list where the last node points back to the first node. - -There is a circular doubly linked list variant where the `prev` pointer of the first node points to the last node and the `next` pointer of the last node points to the first node. +A singly linked list where the last node points back to the first node. There is a circular doubly linked list variant where the `prev` pointer of the first node points to the last node and the `next` pointer of the last node points to the first node. ## Implementations @@ -52,15 +61,6 @@ Out of the common languages, only Java provides a linked list implementation. Th | Insert | O(1) | Assumes you have traversed to the insertion position | | Remove | O(1) | Assumes you have traversed to the node to be removed | -## Learning resources - -- Readings - - [What's a Linked List, Anyway? [Part 1]](https://medium.com/basecs/whats-a-linked-list-anyway-part-1-d8b7e6508b9d), basecs - - [What's a Linked List, Anyway? [Part 2]](https://medium.com/basecs/whats-a-linked-list-anyway-part-2-131d96f71996), basecs -- Videos - - [Singly-linked lists](https://www.coursera.org/lecture/data-structures/singly-linked-lists-kHhgK), University of California San Diego - - [Doubly linked lists](https://www.coursera.org/lecture/data-structures/doubly-linked-lists-jpGKD), University of California San Diego - ## Common routines Be familiar with the following routines because many linked list questions make use of one or more of these routines in the solution: diff --git a/contents/algorithms/queue.md b/contents/algorithms/queue.md index 2af84133..aaba07ba 100644 --- a/contents/algorithms/queue.md +++ b/contents/algorithms/queue.md @@ -12,6 +12,13 @@ This behavior is commonly called FIFO (first in, first out). The name "queue" fo Breadth-first search is commonly implemented using queues. +## Learning resources + +- Readings + - [To Queue Or Not To Queue](https://medium.com/basecs/to-queue-or-not-to-queue-2653bcde5b04), basecs +- Videos + - [Queues](https://www.coursera.org/lecture/data-structures/queues-EShpq), University of California San Diego + ## Implementations | Language | API | @@ -31,12 +38,9 @@ Breadth-first search is commonly implemented using queues. | Back | O(1) | | isEmpty | O(1) | -## Learning resources +## Things to look out for during interviews -- Readings - - [To Queue Or Not To Queue](https://medium.com/basecs/to-queue-or-not-to-queue-2653bcde5b04), basecs -- Videos - - [Queues](https://www.coursera.org/lecture/data-structures/queues-EShpq), University of California San Diego +Most languages don't have a built in Queue class which to be used, and candidates often use arrays (JavaScript) or lists (Python) as a queue. However, note that the enqueue operation in such a scenario will be O(n) because it requires shifting of all other elements by one. In such cases, you can flag this to the interviewer and say that you assume that there's a queue data structure to use which has an efficient enqueue operation. ## Corner cases @@ -44,10 +48,6 @@ Breadth-first search is commonly implemented using queues. - Queue with one item - Queue with two items -## Things to look out for during interviews - -Most languages don't have a built in Queue class which to be used, and candidates often use arrays (JavaScript) or lists (Python) as a queue. However, note that the enqueue operation in such a scenario will be O(n) because it requires shifting of all other elements by one. In such cases, you can flag this to the interviewer and say that you assume that there's a queue data structure to use which has an efficient enqueue operation. - ## Recommended questions - [Implement Queue using Stacks](https://leetcode.com/problems/implement-queue-using-stacks) diff --git a/contents/algorithms/recursion.md b/contents/algorithms/recursion.md index 39f769d0..cbaab2b6 100644 --- a/contents/algorithms/recursion.md +++ b/contents/algorithms/recursion.md @@ -27,8 +27,6 @@ def fib(n): Many algorithms relevant in coding interviews make heavy use of recursion - binary search, merge sort, tree traversal, depth-first search, etc. In this article, we focus on questions which use recursion but aren't part of other well known algorithms. - - ## Learning resources - Readings @@ -36,11 +34,7 @@ Many algorithms relevant in coding interviews make heavy use of recursion - bina - Videos - [Tail Recursion](https://www.coursera.org/lecture/programming-languages/tail-recursion-YZic1), University of Washington -## Corner cases - -- `n = 0` -- `n = 1` -- Make sure you have enough base cases to cover all possible invocations of the recursive function + ## Things to look out for during interviews @@ -49,6 +43,12 @@ Many algorithms relevant in coding interviews make heavy use of recursion - bina - Recursion implicitly uses a stack. Hence all recursive approaches can be rewritten iteratively using a stack. Beware of cases where the recursion level goes too deep and causes a stack overflow (the default limit in Python is 1000). You may get bonus points for pointing this out to the interviewer. Recursion will never be O(1) space complexity because a stack is involved, unless there is [tail-call optimization](https://stackoverflow.com/questions/310974/what-is-tail-call-optimization) (TCO). Find out if your chosen language supports TCO. - Number of base cases - In the fibonacci example above, note that one of our recursive calls invoke `fib(n - 2)`. This indicates that you should have 2 base cases defined so that your code covers all possible invocations of the function within the input range. If your recursive function only invokes `fn(n - 1)`, then only one base case is needed +## Corner cases + +- `n = 0` +- `n = 1` +- Make sure you have enough base cases to cover all possible invocations of the recursive function + ## Techniques ### Memoization diff --git a/contents/algorithms/sorting-searching.md b/contents/algorithms/sorting-searching.md index c7a17330..dd10d110 100644 --- a/contents/algorithms/sorting-searching.md +++ b/contents/algorithms/sorting-searching.md @@ -12,6 +12,24 @@ A number of basic algorithms run in O(n2) and should not be used in i On a sorted array of elements, by leveraging on its sorted property, searching can be done on them in faster than O(n) time by using a binary search. Binary search compares the target value with the middle element of the array, which informs the algorithm whether the target value lies in the left half or the right half, and this comparison proceeds on the remaining half until the target is found or the remaining half is empty. +## Learning resources + +While you're unlikely to be asked to implement a sorting algorithm from scratch during an interview, it is good to know the various time complexities of the different sorting algorithms. + +- Readings + - [Sorting Out The Basics Behind Sorting Algorithms](https://medium.com/basecs/sorting-out-the-basics-behind-sorting-algorithms-b0a032873add), basecs + - [Binary Search](https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/), Khan Academy +- Additional (only if you have time) + - [Exponentially Easy Selection Sort](https://medium.com/basecs/exponentially-easy-selection-sort-d7a34292b049), basecs + - [Bubbling Up With Bubble Sorts](https://medium.com/basecs/bubbling-up-with-bubble-sorts-3df5ac88e592), basecs + - [Inching Towards Insertion Sort](https://medium.com/basecs/inching-towards-insertion-sort-9799274430da), basecs + - [Making Sense of Merge Sort (Part 1)](https://medium.com/basecs/making-sense-of-merge-sort-part-1-49649a143478), basecs + - [Making Sense of Merge Sort (Part 2)](https://medium.com/basecs/making-sense-of-merge-sort-part-2-be8706453209), basecs + - [Pivoting To Understand Quicksort (Part 1)](https://medium.com/basecs/pivoting-to-understand-quicksort-part-1-75178dfb9313), basecs + - [Pivoting To Understand Quicksort (Part 2)](https://medium.com/basecs/pivoting-to-understand-quicksort-part-2-30161aefe1d3), basecs + - [Counting Linearly With Counting Sort](https://medium.com/basecs/counting-linearly-with-counting-sort-cd8516ae09b3), basecs + - [Getting To The Root Of Sorting With Radix Sort](https://medium.com/basecs/getting-to-the-root-of-sorting-with-radix-sort-f8e9240d4224), basecs + ## Time complexity | Algorithm | Time | Space | @@ -29,23 +47,9 @@ On a sorted array of elements, by leveraging on its sorted property, searching c | ------------- | --------- | | Binary search | O(log(n)) | -## Learning resources - -While you're unlikely to be asked to implement a sorting algorithm from scratch during an interview, it is good to know the various time complexities of the different sorting algorithms. +## Things to look out for during interviews -- Readings - - [Sorting Out The Basics Behind Sorting Algorithms](https://medium.com/basecs/sorting-out-the-basics-behind-sorting-algorithms-b0a032873add), basecs - - [Binary Search](https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/), Khan Academy -- Additional (only if you have time) - - [Exponentially Easy Selection Sort](https://medium.com/basecs/exponentially-easy-selection-sort-d7a34292b049), basecs - - [Bubbling Up With Bubble Sorts](https://medium.com/basecs/bubbling-up-with-bubble-sorts-3df5ac88e592), basecs - - [Inching Towards Insertion Sort](https://medium.com/basecs/inching-towards-insertion-sort-9799274430da), basecs - - [Making Sense of Merge Sort (Part 1)](https://medium.com/basecs/making-sense-of-merge-sort-part-1-49649a143478), basecs - - [Making Sense of Merge Sort (Part 2)](https://medium.com/basecs/making-sense-of-merge-sort-part-2-be8706453209), basecs - - [Pivoting To Understand Quicksort (Part 1)](https://medium.com/basecs/pivoting-to-understand-quicksort-part-1-75178dfb9313), basecs - - [Pivoting To Understand Quicksort (Part 2)](https://medium.com/basecs/pivoting-to-understand-quicksort-part-2-30161aefe1d3), basecs - - [Counting Linearly With Counting Sort](https://medium.com/basecs/counting-linearly-with-counting-sort-cd8516ae09b3), basecs - - [Getting To The Root Of Sorting With Radix Sort](https://medium.com/basecs/getting-to-the-root-of-sorting-with-radix-sort-f8e9240d4224), basecs +Make sure you know the time and space complexity of the language's default sorting algorithm! The time complexity is almost definitely O(nlog(n))). Bonus points if you can name the sort. In Python, it's [Timsort](https://en.wikipedia.org/wiki/Timsort). ## Corner cases @@ -54,10 +58,6 @@ While you're unlikely to be asked to implement a sorting algorithm from scratch - Sequence with two elements - Sequence containing duplicate elements. -## Things to look out for during interviews - -Make sure you know the time and space complexity of the language's default sorting algorithm! The time complexity is almost definitely O(nlog(n))). Bonus points if you can name the sort. In Python, it's [Timsort](https://en.wikipedia.org/wiki/Timsort). - ## Techniques ### Sorted inputs diff --git a/contents/algorithms/stack.md b/contents/algorithms/stack.md index bbae67ed..03317931 100644 --- a/contents/algorithms/stack.md +++ b/contents/algorithms/stack.md @@ -12,6 +12,13 @@ This behavior is commonly called LIFO (last in, first out). The name "stack" for Stacks are an important way of supporting nested or recursive function calls and is used to implement depth-first search. Depth-first search can be implemented using recursion or a manual stack. +## Learning resources + +- Readings + - [Stacks and Overflows](https://medium.com/basecs/stacks-and-overflows-dbcf7854dc67), basecs +- Videos + - [Stacks](https://www.coursera.org/lecture/data-structures/stacks-UdKzQ), University of California San Diego + ## Implementations | Language | API | @@ -31,13 +38,6 @@ Stacks are an important way of supporting nested or recursive function calls and | isEmpty | O(1) | | Search | O(n) | -## Learning resources - -- Readings - - [Stacks and Overflows](https://medium.com/basecs/stacks-and-overflows-dbcf7854dc67), basecs -- Videos - - [Stacks](https://www.coursera.org/lecture/data-structures/stacks-UdKzQ), University of California San Diego - ## Corner cases - Empty stack. Popping from an empty stack diff --git a/contents/algorithms/string.md b/contents/algorithms/string.md index ce7d3889..81208b3e 100644 --- a/contents/algorithms/string.md +++ b/contents/algorithms/string.md @@ -41,6 +41,10 @@ Here we assume the other string is of length m. | Split (by token) | O(m) | | | Strip (remove leading and trailing whitespaces) | O(n) | | +## Things to look out for during interviews + +Ask about input character set and case sensitivity. Usually the characters are limited to lowercase Latin characters, for example a to z. + ## Corner cases - Empty string @@ -48,10 +52,6 @@ Here we assume the other string is of length m. - String with repeated characters - Strings with only distinct characters -## Things to look out for during interviews - -Ask about input character set and case sensitivity. Usually the characters are limited to lowercase Latin characters, for example a to z. - ## Techniques Many string questions fall into one of these buckets. diff --git a/contents/algorithms/tree.md b/contents/algorithms/tree.md index 005cc062..78af336e 100644 --- a/contents/algorithms/tree.md +++ b/contents/algorithms/tree.md @@ -14,6 +14,18 @@ For the purpose of interviews, you will usually be asked on binary trees as oppo Trees are commonly used to represent hierarchical data, e.g. file systems, JSON, and HTML documents. Do check out the section on [Trie](trie.md), which is an advanced tree used for efficiently storing and searching strings. +## Learning resources + +- Videos + - [Trees](https://www.coursera.org/lecture/data-structures/trees-95qda), University of California San Diego +- Readings + - [How To Not Be Stumped By Trees](https://medium.com/basecs/how-to-not-be-stumped-by-trees-5f36208f68a7), basecs + - [Leaf It Up To Binary Trees](https://medium.com/basecs/leaf-it-up-to-binary-trees-11001aaf746d), basecs +- Additional (only if you have time) + - [The Little AVL Tree That Could](https://medium.com/basecs/the-little-avl-tree-that-could-86a3cae410c7), basecs + - [Busying Oneself With B-Trees](https://medium.com/basecs/busying-oneself-with-b-trees-78bbf10522e7), basecs + - [Painting Nodes Black With Red-Black Trees](https://medium.com/basecs/painting-nodes-black-with-red-black-trees-60eacb2be9a5), basecs + ## Common terms you need to know - **Neighbor** - Parent or child of a node @@ -68,17 +80,9 @@ When a question involves a BST, the interviewer is usually looking for a solutio Space complexity of traversing balanced trees is O(n) while traversing very skewed trees (which is essentially a linked list) will be O(n). -## Learning resources +## Things to look out for during interviews -- Videos - - [Trees](https://www.coursera.org/lecture/data-structures/trees-95qda), University of California San Diego -- Readings - - [How To Not Be Stumped By Trees](https://medium.com/basecs/how-to-not-be-stumped-by-trees-5f36208f68a7), basecs - - [Leaf It Up To Binary Trees](https://medium.com/basecs/leaf-it-up-to-binary-trees-11001aaf746d), basecs -- Additional (only if you have time) - - [The Little AVL Tree That Could](https://medium.com/basecs/the-little-avl-tree-that-could-86a3cae410c7), basecs - - [Busying Oneself With B-Trees](https://medium.com/basecs/busying-oneself-with-b-trees-78bbf10522e7), basecs - - [Painting Nodes Black With Red-Black Trees](https://medium.com/basecs/painting-nodes-black-with-red-black-trees-60eacb2be9a5), basecs +You should be very familiar with writing pre-order, in-order, and post-order traversal recursively. As an extension, challenge yourself by writing them iteratively. Sometimes interviewers ask candidates for the iterative approach, especially if the candidate finishes writing the recursive approach too quickly. ## Corner cases @@ -87,10 +91,6 @@ Space complexity of traversing balanced trees is O(n) while traversing very skew - Two nodes - Very skewed tree (like a linked list) -## Things to look out for during interviews - -You should be very familiar with writing pre-order, in-order, and post-order traversal recursively. As an extension, challenge yourself by writing them iteratively. Sometimes interviewers ask candidates for the iterative approach, especially if the candidate finishes writing the recursive approach too quickly. - ## Common routines Be familiar with the following routines because many tree questions make use of one or more of these routines in the solution: diff --git a/contents/algorithms/trie.md b/contents/algorithms/trie.md index f916b23b..918d8beb 100644 --- a/contents/algorithms/trie.md +++ b/contents/algorithms/trie.md @@ -10,6 +10,14 @@ Tries are special trees (prefix trees) that make searching and storing strings m Be familiar with implementing from scratch, a `Trie` class and its `add`, `remove` and `search` methods. +## Learning resources + +- Readings + - [Trying to Understand Tries](https://medium.com/basecs/trying-to-understand-tries-3ec6bede0014), basecs + - [Implement Trie (Prefix Tree)](https://leetcode.com/articles/implement-trie-prefix-tree/), LeetCode +- Additional (only if you have time) + - [Compressing Radix Trees Without (Too Many) Tears](https://medium.com/basecs/compressing-radix-trees-without-too-many-tears-a2e658adb9a0), basecs + ## Time complexity `m` is the length of the string used in the operation. @@ -20,14 +28,6 @@ Be familiar with implementing from scratch, a `Trie` class and its `add`, `remov | Insert | O(m) | | | Remove | O(m) | | -## Learning resources - -- Readings - - [Trying to Understand Tries](https://medium.com/basecs/trying-to-understand-tries-3ec6bede0014), basecs - - [Implement Trie (Prefix Tree)](https://leetcode.com/articles/implement-trie-prefix-tree/), LeetCode -- Additional (only if you have time) - - [Compressing Radix Trees Without (Too Many) Tears](https://medium.com/basecs/compressing-radix-trees-without-too-many-tears-a2e658adb9a0), basecs - ## Corner cases - Searching for a string in an empty trie