diff --git a/README.md b/README.md
index 2c6f92c8..bebd786d 100644
--- a/README.md
+++ b/README.md
@@ -15,20 +15,20 @@
Carefully curated content to help you ace your next technical interview, with a focus on algorithms and the front end domain. System design questions are in-progress. Besides the usual algorithm questions, other **awesome** stuff includes:
-- [How to prepare](preparing) for coding interviews
-- [Interview Cheatsheet](preparing/cheatsheet.md) - Straight-to-the-point Do's and Don'ts π
-- [Algorithm tips and the best practice questions](algorithms) categorized by topic
-- ["Front-end Job Interview Questions" answers](front-end/interview-questions.md)
-- [Interview formats](non-technical/interview-formats.md) of the top tech companies
-- [Behavioral questions](non-technical/behavioral.md) categorized by companies
-- [Good questions to ask your interviewers](non-technical/questions-to-ask.md) at the end of the interviews
-- [Helpful resume tips](non-technical/resume.md) to get your resume noticed and the Do's and Don'ts
+* [How to prepare](preparing) for coding interviews
+* [Interview Cheatsheet](preparing/cheatsheet.md) - Straight-to-the-point Do's and Don'ts π
+* [Algorithm tips and the best practice questions](algorithms) categorized by topic
+* ["Front-end Job Interview Questions" answers](front-end/interview-questions.md)
+* [Interview formats](non-technical/interview-formats.md) of the top tech companies
+* [Behavioral questions](non-technical/behavioral.md) categorized by companies
+* [Good questions to ask your interviewers](non-technical/questions-to-ask.md) at the end of the interviews
+* [Helpful resume tips](non-technical/resume.md) to get your resume noticed and the Do's and Don'ts
This handbook is pretty new and help from you in contributing content would be very much appreciated!
## Why do I want this?
-This repository has *practical* content that covers all phases of a technical interview, from applying for a job to passing the interviews to offer negotiation. Technically competent candidates might still find the non-technical content helpful as well.
+This repository has _practical_ content that covers all phases of a technical interview, from applying for a job to passing the interviews to offer negotiation. Technically competent candidates might still find the non-technical content helpful as well.
## Who is this for?
@@ -42,21 +42,21 @@ Also, existing resources focus mainly on algorithm questions and lack coverage f
## Contents
-- **[Preparing for a Coding Interview](preparing)**
- - [Interview cheatsheet](preparing/cheatsheet.md) - Straight-to-the-point Do's and Don'ts
-- **[Algorithm Questions](algorithms)** - Questions categorized by topics
-- **[Design Questions](design)**
-- **[Front-end Study Notes](front-end)** - Summarized notes on the various aspects of front-end
- - [Front-end Job Interview Questions and Answers](front-end/interview-questions.md) π₯β
-- **[Non-Technical Tips](non-technical)** - Random non-technical tips that cover behavioral and psychological aspects, interview formats and "Do you have any questions for me?"
- - [Resume Tips](non-technical/resume.md)
- - [Behavioral Questions](non-technical/behavioral.md)
- - [Interview Formats](non-technical/interview-formats.md)
- - [Psychological Tricks](non-technical/psychological-tricks.md)
- - [Questions to Ask](non-technical/questions-to-ask.md)
- - [Negotiation Tips](non-technical/negotiation.md)
-- **[Utilities](utilities)** - Snippets of algorithms/code that will help in coding questions
- - **UPDATE** - Check out [Lago](https://github.com/yangshun/lago), which is a Data Structures and Algorithms library that contains more high-quality implementations with 100% test coverage.
+* **[Preparing for a Coding Interview](preparing)**
+ * [Interview cheatsheet](preparing/cheatsheet.md) - Straight-to-the-point Do's and Don'ts
+* **[Algorithm Questions](algorithms)** - Questions categorized by topics
+* **[Design Questions](design)**
+* **[Front-end Study Notes](front-end)** - Summarized notes on the various aspects of front-end
+ * [Front-end Job Interview Questions and Answers](front-end/interview-questions.md) π₯β
+* **[Non-Technical Tips](non-technical)** - Random non-technical tips that cover behavioral and psychological aspects, interview formats and "Do you have any questions for me?"
+ * [Resume Tips](non-technical/resume.md)
+ * [Behavioral Questions](non-technical/behavioral.md)
+ * [Interview Formats](non-technical/interview-formats.md)
+ * [Psychological Tricks](non-technical/psychological-tricks.md)
+ * [Questions to Ask](non-technical/questions-to-ask.md)
+ * [Negotiation Tips](non-technical/negotiation.md)
+* **[Utilities](utilities)** - Snippets of algorithms/code that will help in coding questions
+ * **UPDATE** - Check out [Lago](https://github.com/yangshun/lago), which is a Data Structures and Algorithms library that contains more high-quality implementations with 100% test coverage.
## Related
@@ -68,5 +68,5 @@ There are no formal contributing guidelines at the moment as things are still in
## Maintainers
-- [Yangshun Tay](https://github.com/yangshun)
-- [Louie Tan](https://github.com/louietyj)
+* [Yangshun Tay](https://github.com/yangshun)
+* [Louie Tan](https://github.com/louietyj)
diff --git a/algorithms/README.md b/algorithms/README.md
index abc4ca9e..92e5f34c 100644
--- a/algorithms/README.md
+++ b/algorithms/README.md
@@ -1,5 +1,4 @@
-Algorithm Questions
-==
+# Algorithm Questions
This section dives deep into practical tips for specific topics of algorithms and data structures which appear frequently in coding questions. Many algorithm questions involve techniques that can be applied to questions of similar nature. 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!
@@ -9,23 +8,23 @@ If you are interested in how data structures are implemented, check out [Lago](h
## Contents
-- [Array](array.md)
-- [Dynamic Programming and Memoization](dynamic-programming.md)
-- [Geometry](geometry.md)
-- [Graph](graph.md)
-- [Hash Table](hash-table.md)
-- [Heap](heap.md)
-- [Interval](interval.md)
-- [Linked List](linked-list.md)
-- [Math](math.md)
-- [Matrix](matrix.md)
-- [Object-Oriented Programming](oop.md)
-- [Permutation](permutation.md)
-- [Queue](queue.md)
-- [Sorting and Searching](sorting-searching.md)
-- [Stack](stack.md)
-- [String](string.md)
-- [Tree](tree.md)
+* [Array](array.md)
+* [Dynamic Programming and Memoization](dynamic-programming.md)
+* [Geometry](geometry.md)
+* [Graph](graph.md)
+* [Hash Table](hash-table.md)
+* [Heap](heap.md)
+* [Interval](interval.md)
+* [Linked List](linked-list.md)
+* [Math](math.md)
+* [Matrix](matrix.md)
+* [Object-Oriented Programming](oop.md)
+* [Permutation](permutation.md)
+* [Queue](queue.md)
+* [Sorting and Searching](sorting-searching.md)
+* [Stack](stack.md)
+* [String](string.md)
+* [Tree](tree.md)
## General Tips
@@ -45,12 +44,12 @@ Is the algorithm meant to be run multiple times, for example in a web server? If
Use a mix of functional and imperative programming paradigms:
-- Write pure functions as much as possible.
-- Pure functions are easier to reason about and can help to reduce bugs in your implementation.
-- Avoid mutating the parameters passed into your function especially if they are passed by reference unless you are sure of what you are doing.
-- However, functional programming is usually expensive in terms of space complexity because of non-mutation and the repeated allocation of new objects. On the other hand, imperative code is faster because you operate on existing objects. Hence you will need to achieve a balance between accuracy vs efficiency, by using the right amount of functional and imperative code where appropriate.
-- Avoid relying on and mutating global variables. Global variables introduce state.
-- If you have to rely on global variables, make sure that you do not mutate it by accident.
+* Write pure functions as much as possible.
+* Pure functions are easier to reason about and can help to reduce bugs in your implementation.
+* Avoid mutating the parameters passed into your function especially if they are passed by reference unless you are sure of what you are doing.
+* However, functional programming is usually expensive in terms of space complexity because of non-mutation and the repeated allocation of new objects. On the other hand, imperative code is faster because you operate on existing objects. Hence you will need to achieve a balance between accuracy vs efficiency, by using the right amount of functional and imperative code where appropriate.
+* Avoid relying on and mutating global variables. Global variables introduce state.
+* If you have to rely on global variables, make sure that you do not mutate it by accident.
Generally, to improve the speed of a program, we can either choose a more appropriate data structure/algorithm or use more memory. It's a classic space/time tradeoff.
@@ -82,9 +81,9 @@ When you are given two sequences to process, it is common to have one index per
#### Corner Cases
-- Empty sequence.
-- Sequence with 1 or 2 elements.
-- Sequence with repeated elements.
+* Empty sequence.
+* Sequence with 1 or 2 elements.
+* Sequence with repeated elements.
## Array
@@ -100,22 +99,22 @@ If you are given a sequence and the interviewer asks for O(1) space, it might be
#### Practice Questions
-- [Two Sum](https://leetcode.com/problems/two-sum/)
-- [Best Time to Buy and Sell Stock](https://leetcode.com/problems/best-time-to-buy-and-sell-stock/)
-- [Contains Duplicate](https://leetcode.com/problems/contains-duplicate/)
-- [Product of Array Except Self](https://leetcode.com/problems/product-of-array-except-self/)
-- [Maximum Subarray](https://leetcode.com/problems/maximum-subarray/)
-- [Maximum Product Subarray](https://leetcode.com/problems/maximum-product-subarray/)
-- [Find Minimum in Rotated Sorted Array](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/)
-- [Search in Rotated Sorted Array](https://leetcode.com/problems/search-in-rotated-sorted-array/)
-- [3Sum](https://leetcode.com/problems/3sum/)
-- [Container With Most Water](https://leetcode.com/problems/container-with-most-water/)
+* [Two Sum](https://leetcode.com/problems/two-sum/)
+* [Best Time to Buy and Sell Stock](https://leetcode.com/problems/best-time-to-buy-and-sell-stock/)
+* [Contains Duplicate](https://leetcode.com/problems/contains-duplicate/)
+* [Product of Array Except Self](https://leetcode.com/problems/product-of-array-except-self/)
+* [Maximum Subarray](https://leetcode.com/problems/maximum-subarray/)
+* [Maximum Product Subarray](https://leetcode.com/problems/maximum-product-subarray/)
+* [Find Minimum in Rotated Sorted Array](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/)
+* [Search in Rotated Sorted Array](https://leetcode.com/problems/search-in-rotated-sorted-array/)
+* [3Sum](https://leetcode.com/problems/3sum/)
+* [Container With Most Water](https://leetcode.com/problems/container-with-most-water/)
## Binary
#### Study Links
-- [Bits, Bytes, Building With Binary](https://medium.com/basecs/bits-bytes-building-with-binary-13cb4289aafa)
+* [Bits, Bytes, Building With Binary](https://medium.com/basecs/bits-bytes-building-with-binary-13cb4289aafa)
#### Notes
@@ -123,30 +122,30 @@ Questions involving binary representations and bitwise operations are asked some
Some helpful utility snippets:
-- Test kth bit is set: `num & (1 << k) != 0`.
-- Set kth bit: `num |= (1 << k)`.
-- Turn off kth bit: `num &= ~(1 << k)`.
-- Toggle the kth bit: `num ^= (1 << k)`.
-- To check if a number is a power of 2, `num & num - 1 == 0`.
+* Test kth bit is set: `num & (1 << k) != 0`.
+* Set kth bit: `num |= (1 << k)`.
+* Turn off kth bit: `num &= ~(1 << k)`.
+* Toggle the kth bit: `num ^= (1 << k)`.
+* To check if a number is a power of 2, `num & num - 1 == 0`.
#### Corner Cases
-- Check for overflow/underflow.
-- Negative numbers.
+* Check for overflow/underflow.
+* Negative numbers.
#### Practice Questions
-- [Sum of Two Integers](https://leetcode.com/problems/sum-of-two-integers/)
-- [Number of 1 Bits](https://leetcode.com/problems/number-of-1-bits/)
-- [Counting Bits](https://leetcode.com/problems/counting-bits/)
-- [Missing Number](https://leetcode.com/problems/missing-number/)
-- [Reverse Bits](https://leetcode.com/problems/reverse-bits/)
+* [Sum of Two Integers](https://leetcode.com/problems/sum-of-two-integers/)
+* [Number of 1 Bits](https://leetcode.com/problems/number-of-1-bits/)
+* [Counting Bits](https://leetcode.com/problems/counting-bits/)
+* [Missing Number](https://leetcode.com/problems/missing-number/)
+* [Reverse Bits](https://leetcode.com/problems/reverse-bits/)
## Dynamic Programming
#### Study Links
-- [Demystifying Dynamic Programming](https://medium.freecodecamp.org/demystifying-dynamic-programming-3efafb8d4296)
+* [Demystifying Dynamic Programming](https://medium.freecodecamp.org/demystifying-dynamic-programming-3efafb8d4296)
#### Notes
@@ -156,17 +155,17 @@ Sometimes you do not need to store the whole DP table in memory, the last two va
#### Practice Questions
-- 0/1 Knapsack
-- [Climbing Stairs](https://leetcode.com/problems/climbing-stairs/)
-- [Coin Change](https://leetcode.com/problems/coin-change/)
-- [Longest Increasing Subsequence](https://leetcode.com/problems/longest-increasing-subsequence/)
-- [Longest Common Subsequence]()
-- [Word Break Problem](https://leetcode.com/problems/word-break/)
-- [Combination Sum](https://leetcode.com/problems/combination-sum-iv/)
-- [House Robber](https://leetcode.com/problems/house-robber/) and [House Robber II](https://leetcode.com/problems/house-robber-ii/)
-- [Decode Ways](https://leetcode.com/problems/decode-ways/)
-- [Unique Paths](https://leetcode.com/problems/unique-paths/)
-- [Jump Game](https://leetcode.com/problems/jump-game/)
+* 0/1 Knapsack
+* [Climbing Stairs](https://leetcode.com/problems/climbing-stairs/)
+* [Coin Change](https://leetcode.com/problems/coin-change/)
+* [Longest Increasing Subsequence](https://leetcode.com/problems/longest-increasing-subsequence/)
+* [Longest Common Subsequence]()
+* [Word Break Problem](https://leetcode.com/problems/word-break/)
+* [Combination Sum](https://leetcode.com/problems/combination-sum-iv/)
+* [House Robber](https://leetcode.com/problems/house-robber/) and [House Robber II](https://leetcode.com/problems/house-robber-ii/)
+* [Decode Ways](https://leetcode.com/problems/decode-ways/)
+* [Unique Paths](https://leetcode.com/problems/unique-paths/)
+* [Jump Game](https://leetcode.com/problems/jump-game/)
## Geometry
@@ -180,26 +179,27 @@ To find out if two circles overlap, check that the distance between the two cent
#### Study Links
-- [From Theory To Practice: Representing Graphs](https://medium.com/basecs/from-theory-to-practice-representing-graphs-cfd782c5be38)
-- [Deep Dive Through A Graph: DFS Traversal](https://medium.com/basecs/deep-dive-through-a-graph-dfs-traversal-8177df5d0f13)
-- [Going Broad In A Graph: BFS Traversal](https://medium.com/basecs/going-broad-in-a-graph-bfs-traversal-959bd1a09255)
+* [From Theory To Practice: Representing Graphs](https://medium.com/basecs/from-theory-to-practice-representing-graphs-cfd782c5be38)
+* [Deep Dive Through A Graph: DFS Traversal](https://medium.com/basecs/deep-dive-through-a-graph-dfs-traversal-8177df5d0f13)
+* [Going Broad In A Graph: BFS Traversal](https://medium.com/basecs/going-broad-in-a-graph-bfs-traversal-959bd1a09255)
#### Notes
Be familiar with the various graph representations, graph search algorithms and their time and space complexities.
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:
- - Adjacency matrix.
- - Adjacency list.
- - Hashmap of hashmaps.
+
+* Adjacency matrix.
+* Adjacency list.
+* Hashmap of hashmaps.
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.
#### Graph search algorithms:
-- **Common** - Breadth-first Search, Depth-first Search
-- **Uncommon** - Topological Sort, Dijkstra's algorithm
-- **Rare** - Bellman-Ford algorithm, Floyd-Warshall algorithm, Prim's algorithm, Kruskal's algorithm
+* **Common** - Breadth-first Search, Depth-first Search
+* **Uncommon** - Topological Sort, Dijkstra's algorithm
+* **Rare** - Bellman-Ford algorithm, Floyd-Warshall algorithm, Prim's algorithm, Kruskal's algorithm
In coding interviews, graphs are commonly represented as 2-D matrices where cells are the nodes and each cell can traverse to its adjacent cells (up/down/left/right). Hence it is important that you be familiar with traversing a 2-D matrix. When recursively traversing the matrix, always ensure that your next position is within the boundary of the matrix. More tips for doing depth-first searches on a matrix can be found [here](https://discuss.leetcode.com/topic/66065/python-dfs-bests-85-tips-for-all-dfs-in-matrix-question/). A simple template for doing depth-first searches on a matrix goes like this:
@@ -226,21 +226,21 @@ def traverse(matrix):
#### Corner Cases
-- Empty graph.
-- Graph with one or two nodes.
-- Disjoint graphs.
-- Graph with cycles.
+* Empty graph.
+* Graph with one or two nodes.
+* Disjoint graphs.
+* Graph with cycles.
#### Practice Questions
-- [Clone Graph](https://leetcode.com/problems/clone-graph/)
-- [Course Schedule](https://leetcode.com/problems/course-schedule/)
-- [Pacific Atlantic Water Flow](https://leetcode.com/problems/pacific-atlantic-water-flow/)
-- [Number of Islands](https://leetcode.com/problems/number-of-islands/)
-- [Longest Consecutive Sequence](https://leetcode.com/problems/longest-consecutive-sequence/)
-- [Alien Dictionary (Leetcode Premium)](https://leetcode.com/problems/alien-dictionary/)
-- [Graph Valid Tree (Leetcode Premium)](https://leetcode.com/problems/graph-valid-tree/)
-- [Number of Connected Components in an Undirected Graph (Leetcode Premium)](https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/)
+* [Clone Graph](https://leetcode.com/problems/clone-graph/)
+* [Course Schedule](https://leetcode.com/problems/course-schedule/)
+* [Pacific Atlantic Water Flow](https://leetcode.com/problems/pacific-atlantic-water-flow/)
+* [Number of Islands](https://leetcode.com/problems/number-of-islands/)
+* [Longest Consecutive Sequence](https://leetcode.com/problems/longest-consecutive-sequence/)
+* [Alien Dictionary (Leetcode Premium)](https://leetcode.com/problems/alien-dictionary/)
+* [Graph Valid Tree (Leetcode Premium)](https://leetcode.com/problems/graph-valid-tree/)
+* [Number of Connected Components in an Undirected Graph (Leetcode Premium)](https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/)
## Interval
@@ -268,17 +268,17 @@ def merge_overlapping_intervals(a, b):
#### Corner Cases
-- Single interval.
-- Non-overlapping intervals.
-- An interval totally consumed within another interval.
-- Duplicate intervals.
+* Single interval.
+* Non-overlapping intervals.
+* An interval totally consumed within another interval.
+* Duplicate intervals.
#### Practice Questions
-- [Insert Interval](https://leetcode.com/problems/insert-interval/)
-- [Merge Intervals](https://leetcode.com/problems/merge-intervals/)
-- [Non-overlapping Intervals](https://leetcode.com/problems/non-overlapping-intervals/)
-- [Meeting Rooms (Leetcode Premium)](https://leetcode.com/problems/meeting-rooms/) and [Meeting Rooms II (Leetcode Premium)](https://leetcode.com/problems/meeting-rooms-ii/)
+* [Insert Interval](https://leetcode.com/problems/insert-interval/)
+* [Merge Intervals](https://leetcode.com/problems/merge-intervals/)
+* [Non-overlapping Intervals](https://leetcode.com/problems/non-overlapping-intervals/)
+* [Meeting Rooms (Leetcode Premium)](https://leetcode.com/problems/meeting-rooms/) and [Meeting Rooms II (Leetcode Premium)](https://leetcode.com/problems/meeting-rooms-ii/)
## Linked List
@@ -297,30 +297,32 @@ For partitioning linked lists, create two separate linked lists and join them ba
Linked lists problems share similarity with array problems, think about how you would do it for an array and try to apply it to a linked list.
Two pointer approaches are also common for linked lists. For example:
- - Getting the kth from last node - Have two pointers, where one is k nodes ahead of the other. When the node ahead reaches the end, the other node is k nodes behind.
- - Detecting cycles - Have two pointers, where one pointer increments twice as much as the other, if the two pointers meet, means that there is a cycle.
- - Getting the middle node - Have two pointers, where one pointer increments twice as much as the other. When the faster node reaches the end of the list, the slower node will be at the middle.
+
+* Getting the kth from last node - Have two pointers, where one is k nodes ahead of the other. When the node ahead reaches the end, the other node is k nodes behind.
+* Detecting cycles - Have two pointers, where one pointer increments twice as much as the other, if the two pointers meet, means that there is a cycle.
+* Getting the middle node - Have two pointers, where one pointer increments twice as much as the other. When the faster node reaches the end of the list, the slower node will be at the middle.
Be familiar with the following routines because many linked list questions make use of one or more of these routines in the solution:
- - Counting the number of nodes in the linked list.
- - Reversing a linked list in-place.
- - Finding the middle node of the linked list using fast/slow pointers.
- - Merging two lists together.
+
+* Counting the number of nodes in the linked list.
+* Reversing a linked list in-place.
+* Finding the middle node of the linked list using fast/slow pointers.
+* Merging two lists together.
#### Corner Cases
-- Single node.
-- Two nodes.
-- Linked list has cycle. Clarify with the interviewer whether there can be a cycle in the list. Usually the answer is no.
+* Single node.
+* Two nodes.
+* Linked list has cycle. Clarify with the interviewer whether there can be a cycle in the list. Usually the answer is no.
#### Practice Questions
-- [Reverse a Linked List](https://leetcode.com/problems/reverse-linked-list/)
-- [Detect Cycle in a Linked List](https://leetcode.com/problems/linked-list-cycle/)
-- [Merge Two Sorted Lists](https://leetcode.com/problems/merge-two-sorted-lists/)
-- [Merge K Sorted Lists](https://leetcode.com/problems/merge-k-sorted-lists/)
-- [Remove Nth Node From End Of List](https://leetcode.com/problems/remove-nth-node-from-end-of-list/)
-- [Reorder List](https://leetcode.com/problems/reorder-list/)
+* [Reverse a Linked List](https://leetcode.com/problems/reverse-linked-list/)
+* [Detect Cycle in a Linked List](https://leetcode.com/problems/linked-list-cycle/)
+* [Merge Two Sorted Lists](https://leetcode.com/problems/merge-two-sorted-lists/)
+* [Merge K Sorted Lists](https://leetcode.com/problems/merge-k-sorted-lists/)
+* [Remove Nth Node From End Of List](https://leetcode.com/problems/remove-nth-node-from-end-of-list/)
+* [Reorder List](https://leetcode.com/problems/reorder-list/)
## Math
@@ -338,16 +340,16 @@ If the question asks to implement an operator such as power, squareroot or divis
#### Some common formulas:
-- Sum of 1 to N = (n+1) * n/2
-- Sum of GP = 20 + 21 + 22 + 23 + ... 2n = 2n+1 - 1
-- Permutations of N = N! / (N-K)!
-- Combinations of N = N! / (K! * (N-K)!)
+* Sum of 1 to N = (n+1) \* n/2
+* Sum of GP = 20 + 21 + 22 + 23 + ... 2n = 2n+1 - 1
+* Permutations of N = N! / (N-K)!
+* Combinations of N = N! / (K! \* (N-K)!)
#### Practice Questions
-- [Pow(x, n)](https://leetcode.com/problems/powx-n/)
-- [Sqrt(x)](https://leetcode.com/problems/sqrtx/)
-- [Integer to English Words](https://leetcode.com/problems/integer-to-english-words/)
+* [Pow(x, n)](https://leetcode.com/problems/powx-n/)
+* [Sqrt(x)](https://leetcode.com/problems/sqrtx/)
+* [Integer to English Words](https://leetcode.com/problems/integer-to-english-words/)
## Matrix
@@ -372,16 +374,16 @@ transposed_matrix = zip(*matrix)
#### Corner Cases
-- Empty matrix. Check that none of the arrays are 0 length.
-- 1 x 1 matrix.
-- Matrix with only one row or column.
+* Empty matrix. Check that none of the arrays are 0 length.
+* 1 x 1 matrix.
+* Matrix with only one row or column.
#### Practice Questions
-- [Set Matrix Zeroes](https://leetcode.com/problems/set-matrix-zeroes/)
-- [Spiral Matrix](https://leetcode.com/problems/spiral-matrix/)
-- [Rotate Image](https://leetcode.com/problems/rotate-image/)
-- [Word Search](https://leetcode.com/problems/word-search/)
+* [Set Matrix Zeroes](https://leetcode.com/problems/set-matrix-zeroes/)
+* [Spiral Matrix](https://leetcode.com/problems/spiral-matrix/)
+* [Rotate Image](https://leetcode.com/problems/rotate-image/)
+* [Word Search](https://leetcode.com/problems/word-search/)
## Recursion
@@ -395,8 +397,8 @@ Recursion implicitly uses a stack. Hence all recursive approaches can be rewritt
#### Practice Questions
-- [Subsets](https://leetcode.com/problems/subsets/) and [Subsets II](https://leetcode.com/problems/subsets-ii/)
-- [Strobogrammatic Number II (Leetcode Premium)](https://leetcode.com/problems/strobogrammatic-number-ii/)
+* [Subsets](https://leetcode.com/problems/subsets/) and [Subsets II](https://leetcode.com/problems/subsets-ii/)
+* [Strobogrammatic Number II (Leetcode Premium)](https://leetcode.com/problems/strobogrammatic-number-ii/)
## String
@@ -412,21 +414,21 @@ If you need to keep a counter of characters, a common mistake is to say that the
Common data structures for looking up strings efficiently are
-- [Trie / Prefix Tree](https://en.wikipedia.org/wiki/Trie)
-- [Suffix Tree](https://en.wikipedia.org/wiki/Suffix_tree)
+* [Trie / Prefix Tree](https://en.wikipedia.org/wiki/Trie)
+* [Suffix Tree](https://en.wikipedia.org/wiki/Suffix_tree)
Common string algorithms are
-- [Rabin Karp](https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm) for efficient searching of substring using a rolling hash.
-- [KMP](https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm) for efficient searching of substring.
+* [Rabin Karp](https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm) for efficient searching of substring using a rolling hash.
+* [KMP](https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm) for efficient searching of substring.
#### Corner Cases
-- Strings with only one distinct character.
+* Strings with only one distinct character.
#### Non-repeating Characters
-- Use a 26-bit bitmask to indicate which lower case latin characters are inside the string.
+* Use a 26-bit bitmask to indicate which lower case latin characters are inside the string.
```py
mask = 0
@@ -442,44 +444,44 @@ An anagram is word switch or word play. It is the result of re-arranging the let
To determine if two strings are anagrams, there are a few plausible approaches:
-- Sorting both strings should produce the same resulting string. This takes O(nlgn) time and O(lgn) space.
-- If we map each character to a prime number and we multiply each mapped number together, anagrams should have the same multiple (prime factor decomposition). This takes O(n) time and O(1) space.
-- Frequency counting of characters will help to determine if two strings are anagrams. This also takes O(n) time and O(1) space.
+* Sorting both strings should produce the same resulting string. This takes O(nlgn) time and O(lgn) space.
+* If we map each character to a prime number and we multiply each mapped number together, anagrams should have the same multiple (prime factor decomposition). This takes O(n) time and O(1) space.
+* Frequency counting of characters will help to determine if two strings are anagrams. This also takes O(n) time and O(1) space.
### Palindrome
-A palindrome is a word, phrase, number, or other sequence of characters which reads the same backward as forward, such as *madam* or *racecar*.
+A palindrome is a word, phrase, number, or other sequence of characters which reads the same backward as forward, such as _madam_ or _racecar_.
Here are ways to determine if a string is a palindrome:
-- Reverse the string and it should be equal to itself.
-- Have two pointers at the start and end of the string. Move the pointers inward till they meet. At any point in time, the characters at both pointers should match.
+* Reverse the string and it should be equal to itself.
+* Have two pointers at the start and end of the string. Move the pointers inward till they meet. At any point in time, the characters at both pointers should match.
The order of characters within the string matters, so HashMaps are usually not helpful.
When a question is about counting the number of palindromes, a common trick is to have two pointers that move outward, away from the middle. Note that palindromes can be even or odd length. For each middle pivot position, you need to check it twice: Once that includes the character and once without the character.
-- For substrings, you can terminate early once there is no match.
-- For subsequences, use dynamic programming as there are overlapping subproblems. Check out [this question](https://leetcode.com/problems/longest-palindromic-subsequence/).
+* For substrings, you can terminate early once there is no match.
+* For subsequences, use dynamic programming as there are overlapping subproblems. Check out [this question](https://leetcode.com/problems/longest-palindromic-subsequence/).
#### Practice Questions
-- [Longest Substring Without Repeating Characters](https://leetcode.com/problems/longest-substring-without-repeating-characters/)
-- [Longest Repeating Character Replacement](https://leetcode.com/problems/longest-repeating-character-replacement/)
-- [Minimum Window Substring](https://leetcode.com/problems/minimum-window-substring/description/)
-- [Valid Anagram](https://leetcode.com/problems/valid-anagram)
-- [Group Anagrams](https://leetcode.com/problems/group-anagrams/)
-- [Valid Parentheses](https://leetcode.com/problems/valid-parentheses)
-- [Valid Palindrome](https://leetcode.com/problems/valid-palindrome/)
-- [Longest Palindromic Substring](https://leetcode.com/problems/longest-palindromic-substring/)
-- [Palindromic Substrings](https://leetcode.com/problems/palindromic-substrings/)
-- [Encode and Decode Strings (Leetcode Premium)](https://leetcode.com/problems/encode-and-decode-strings/)
+* [Longest Substring Without Repeating Characters](https://leetcode.com/problems/longest-substring-without-repeating-characters/)
+* [Longest Repeating Character Replacement](https://leetcode.com/problems/longest-repeating-character-replacement/)
+* [Minimum Window Substring](https://leetcode.com/problems/minimum-window-substring/description/)
+* [Valid Anagram](https://leetcode.com/problems/valid-anagram)
+* [Group Anagrams](https://leetcode.com/problems/group-anagrams/)
+* [Valid Parentheses](https://leetcode.com/problems/valid-parentheses)
+* [Valid Palindrome](https://leetcode.com/problems/valid-palindrome/)
+* [Longest Palindromic Substring](https://leetcode.com/problems/longest-palindromic-substring/)
+* [Palindromic Substrings](https://leetcode.com/problems/palindromic-substrings/)
+* [Encode and Decode Strings (Leetcode Premium)](https://leetcode.com/problems/encode-and-decode-strings/)
## Tree
#### Study Links
-- [Leaf It Up To Binary Trees](https://medium.com/basecs/leaf-it-up-to-binary-trees-11001aaf746d)
+* [Leaf It Up To Binary Trees](https://medium.com/basecs/leaf-it-up-to-binary-trees-11001aaf746d)
#### Notes
@@ -497,13 +499,12 @@ If the question involves summation of nodes along the way, be sure to check whet
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
-- Empty tree.
-- Single node.
-- Two nodes.
-- Very skewed tree (like a linked list).
+* Empty tree.
+* Single node.
+* Two nodes.
+* Very skewed tree (like a linked list).
### Binary Tree
@@ -519,24 +520,24 @@ When a question involves a BST, the interviewer is usually looking for a solutio
#### Practice Questions
-- [Maximum Depth of Binary Tree](https://leetcode.com/problems/maximum-depth-of-binary-tree/)
-- [Same Tree](https://leetcode.com/problems/same-tree/)
-- [Invert/Flip Binary Tree](https://leetcode.com/problems/invert-binary-tree/)
-- [Binary Tree Maximum Path Sum](https://leetcode.com/problems/binary-tree-maximum-path-sum/)
-- [Binary Tree Level Order Traversal](https://leetcode.com/problems/binary-tree-level-order-traversal/)
-- [Serialize and Deserialize Binary Tree](https://leetcode.com/problems/serialize-and-deserialize-binary-tree/)
-- [Subtree of Another Tree](https://leetcode.com/problems/subtree-of-another-tree/)
-- [Construct Binary Tree from Preorder and Inorder Traversal](https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/)
-- [Validate Binary Search Tree](https://leetcode.com/problems/validate-binary-search-tree/)
-- [Kth Smallest Element in a BST](https://leetcode.com/problems/kth-smallest-element-in-a-bst/)
-- [Lowest Common Ancestor of BST](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/)
+* [Maximum Depth of Binary Tree](https://leetcode.com/problems/maximum-depth-of-binary-tree/)
+* [Same Tree](https://leetcode.com/problems/same-tree/)
+* [Invert/Flip Binary Tree](https://leetcode.com/problems/invert-binary-tree/)
+* [Binary Tree Maximum Path Sum](https://leetcode.com/problems/binary-tree-maximum-path-sum/)
+* [Binary Tree Level Order Traversal](https://leetcode.com/problems/binary-tree-level-order-traversal/)
+* [Serialize and Deserialize Binary Tree](https://leetcode.com/problems/serialize-and-deserialize-binary-tree/)
+* [Subtree of Another Tree](https://leetcode.com/problems/subtree-of-another-tree/)
+* [Construct Binary Tree from Preorder and Inorder Traversal](https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/)
+* [Validate Binary Search Tree](https://leetcode.com/problems/validate-binary-search-tree/)
+* [Kth Smallest Element in a BST](https://leetcode.com/problems/kth-smallest-element-in-a-bst/)
+* [Lowest Common Ancestor of BST](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/)
## Trie
#### Study Links
-- [Trying to Understand Tries](https://medium.com/basecs/trying-to-understand-tries-3ec6bede0014)
-- [Implement Trie (Prefix Tree)](https://leetcode.com/articles/implement-trie-prefix-tree/)
+* [Trying to Understand Tries](https://medium.com/basecs/trying-to-understand-tries-3ec6bede0014)
+* [Implement Trie (Prefix Tree)](https://leetcode.com/articles/implement-trie-prefix-tree/)
#### Notes
@@ -548,31 +549,31 @@ Be familiar with implementing, from scratch, a `Trie` class and its `add`, `remo
#### Practice Questions
-- [Implement Trie (Prefix Tree)](https://leetcode.com/problems/implement-trie-prefix-tree)
-- [Add and Search Word](https://leetcode.com/problems/add-and-search-word-data-structure-design)
-- [Word Search II](https://leetcode.com/problems/word-search-ii/)
+* [Implement Trie (Prefix Tree)](https://leetcode.com/problems/implement-trie-prefix-tree)
+* [Add and Search Word](https://leetcode.com/problems/add-and-search-word-data-structure-design)
+* [Word Search II](https://leetcode.com/problems/word-search-ii/)
## Heap
#### Study Links
-- [Learning to Love Heaps](https://medium.com/basecs/learning-to-love-heaps-cef2b273a238)
+* [Learning to Love Heaps](https://medium.com/basecs/learning-to-love-heaps-cef2b273a238)
#### Notes
-If you see a top or lowest *k* being mentioned in the question, it is usually a signal that a heap can be used to solve the problem, such as in [Top K Frequent Elements](https://leetcode.com/problems/top-k-frequent-elements/).
+If you see a top or lowest _k_ being mentioned in the question, it is usually a signal that a heap can be used to solve the problem, such as in [Top K Frequent Elements](https://leetcode.com/problems/top-k-frequent-elements/).
-If you require the top *k* elements use a Min Heap of size *k*. Iterate through each element, pushing it into the heap. Whenever the heap size exceeds *k*, remove the minimum element, that will guarantee that you have the *k* largest elements.
+If you require the top _k_ elements use a Min Heap of size _k_. Iterate through each element, pushing it into the heap. Whenever the heap size exceeds _k_, remove the minimum element, that will guarantee that you have the _k_ largest elements.
#### Practice Questions
-- [Merge K Sorted Lists](https://leetcode.com/problems/merge-k-sorted-lists/)
-- [Top K Frequent Elements](https://leetcode.com/problems/top-k-frequent-elements/)
-- [Find Median from Data Stream](https://leetcode.com/problems/find-median-from-data-stream/)
+* [Merge K Sorted Lists](https://leetcode.com/problems/merge-k-sorted-lists/)
+* [Top K Frequent Elements](https://leetcode.com/problems/top-k-frequent-elements/)
+* [Find Median from Data Stream](https://leetcode.com/problems/find-median-from-data-stream/)
###### References
-- http://blog.triplebyte.com/how-to-pass-a-programming-interview
-- https://quip.com/q41AA3OmoZbC
-- http://www.geeksforgeeks.org/must-do-coding-questions-for-companies-like-amazon-microsoft-adobe/
-- https://medium.com/basecs
+* http://blog.triplebyte.com/how-to-pass-a-programming-interview
+* https://quip.com/q41AA3OmoZbC
+* http://www.geeksforgeeks.org/must-do-coding-questions-for-companies-like-amazon-microsoft-adobe/
+* https://medium.com/basecs
diff --git a/algorithms/array.md b/algorithms/array.md
index 0de9fedc..87bca394 100644
--- a/algorithms/array.md
+++ b/algorithms/array.md
@@ -1,14 +1,13 @@
-Arrays
-==
+# Arrays
-- In an array of arrays, e.g. given `[[], [1, 2, 3], [4, 5], [], [], [6, 7], [8], [9, 10], [], []]`, print: `1, 2, 3, 4, 5, 6, 7, 8, 9, 10`.
- - Implement an iterator that supports `hasNext()`, `next()` and `remove()` methods.
-- Given a list of item prices, find all possible combinations of items that sum a particular value `K`.
-- Paginate an array with constraints, such as skipping certain items.
-- Implement a circular buffer using an array.
-- Given array of arrays, sort them in ascending order.
-- Given an array of integers, print out a histogram using the said array; include a base layer (all stars)
- - E.g. `[5, 4, 0, 3, 4, 1]`
+* In an array of arrays, e.g. given `[[], [1, 2, 3], [4, 5], [], [], [6, 7], [8], [9, 10], [], []]`, print: `1, 2, 3, 4, 5, 6, 7, 8, 9, 10`.
+ * Implement an iterator that supports `hasNext()`, `next()` and `remove()` methods.
+* Given a list of item prices, find all possible combinations of items that sum a particular value `K`.
+* Paginate an array with constraints, such as skipping certain items.
+* Implement a circular buffer using an array.
+* Given array of arrays, sort them in ascending order.
+* Given an array of integers, print out a histogram using the said array; include a base layer (all stars)
+ * E.g. `[5, 4, 0, 3, 4, 1]`
```
*
@@ -19,42 +18,42 @@ Arrays
******
```
-- Given an array and an index, find the product of the elements of the array except the element at that index.
-- Given a set of rectangles represented by a height and an interval along the y-axis, determine the size of its union.
-- Given 2 separate arrays, write a method to find the values that exist in both arrays and return them.
-- Given an array of integers find whether there is a sub-sequence that sums to 0 and return it.
- - E.g. `[1, 2, -3, 1]` => `[1, 2, -3]` or `[2, -3, 1]`.
-- Given an input array and another array that describes a new index for each element, mutate the input array so that each element ends up in their new index. Discuss the runtime of the algorithm and how you can be sure there would not be any infinite loops.
-- Given an array of non-negative numbers, find continuous subarray with sum to S.
- - [Source](http://blog.gainlo.co/index.php/2016/06/01/subarray-with-given-sum/).
-- Given an array of numbers list out all triplets that sum to 0. Do so with a running time of less than O(n^3).
- - [Source](http://blog.gainlo.co/index.php/2016/07/19/3sum/).
-- Given an array of numbers list out all quadruplets that sum to 0. Do so with a running time of less than O(n^4).
-- Given an array of integers, move all the zeroes to the end while preserving the order of the other elements. You have to do it in-place and are not allowed to use any extra storage.
-- Given an array of integers, find the subarray with the largest sum. Can you do it in linear time.
- - Maximum subarray sum problem.
-- You have an array with the heights of an island (at point 1, point 2 etc) and you want to know how much water would remain on this island (without flowing away).
- - Trapping rain water question.
-- Given an array containing only digits `0-9`, add one to the number and return the array.
- - E.g. Given `[1, 4, 2, 1]` which represents `1421`, return `[1, 4, 2, 2]` which represents `1422`.
-- Find the second maximum value in an array.
-- Given an array, find the longest arithmetic progression.
-- Rotate an array by an offset of k.
-- Remove duplicates in an unsorted array where the duplicates are at a distance of k or less from each other.
-- Given an unsorted list of integers, return true if the list contains any duplicates within k indices of each element. Do it faster than O(n^2).
-- Given an unsorted list of integers, return true if the list contains any fuzzy duplicates within k indices of each element. A fuzzy duplicate is another integer within d of the original integer. Do it faster than O(n^2).
- - E.g. If d = 4, then 6 is a fuzzy duplicate of 3 but 8 is not.
-- Say you have an unordered list of numbers ranging from 1 to n, and one of the numbers is removed, how do you find that number? What if two numbers are removed?
-- Given an array of string, find the duplicated elements.
- - [Source](http://blog.gainlo.co/index.php/2016/05/10/duplicate-elements-of-an-array/).
-- Given an array of integers, find a maximum sum of non-adjacent elements.
- - E.g. `[1, 0, 3, 9, 2]` should return `10 (1 + 9)`.
- - [Source](http://blog.gainlo.co/index.php/2016/12/02/uber-interview-question-maximum-sum-non-adjacent-elements/)
-- Given an array of integers, modify the array by moving all the zeros to the end (right side). The order of other elements doesn't matter.
- - E.g. `[1, 2, 0, 3, 0, 1, 2]`, the program can output `[1, 2, 3, 1, 2, 0, 0]`.
- - [Source](http://blog.gainlo.co/index.php/2016/11/18/uber-interview-question-move-zeroes/).
-- Given an array, return the length of the longest increasing contiguous subarray.
- - E.g., `[1, 3, 2, 3, 4, 8, 7, 9]`, should return `4` because the longest increasing array is `[2, 3, 4, 8]`.
- - [Source](http://blog.gainlo.co/index.php/2017/02/02/uber-interview-questions-longest-increasing-subarray/).
-- Given an array of integers where every value appears twice except one, find the single, non-repeating value. Follow up: do so with O(1) space.
- - E.g., `[2, 5, 3, 2, 1, 3, 4, 5, 1]` returns 4, because it is the only value that appears in the array only once.
+* Given an array and an index, find the product of the elements of the array except the element at that index.
+* Given a set of rectangles represented by a height and an interval along the y-axis, determine the size of its union.
+* Given 2 separate arrays, write a method to find the values that exist in both arrays and return them.
+* Given an array of integers find whether there is a sub-sequence that sums to 0 and return it.
+ * E.g. `[1, 2, -3, 1]` => `[1, 2, -3]` or `[2, -3, 1]`.
+* Given an input array and another array that describes a new index for each element, mutate the input array so that each element ends up in their new index. Discuss the runtime of the algorithm and how you can be sure there would not be any infinite loops.
+* Given an array of non-negative numbers, find continuous subarray with sum to S.
+ * [Source](http://blog.gainlo.co/index.php/2016/06/01/subarray-with-given-sum/).
+* Given an array of numbers list out all triplets that sum to 0. Do so with a running time of less than O(n^3).
+ * [Source](http://blog.gainlo.co/index.php/2016/07/19/3sum/).
+* Given an array of numbers list out all quadruplets that sum to 0. Do so with a running time of less than O(n^4).
+* Given an array of integers, move all the zeroes to the end while preserving the order of the other elements. You have to do it in-place and are not allowed to use any extra storage.
+* Given an array of integers, find the subarray with the largest sum. Can you do it in linear time.
+ * Maximum subarray sum problem.
+* You have an array with the heights of an island (at point 1, point 2 etc) and you want to know how much water would remain on this island (without flowing away).
+ * Trapping rain water question.
+* Given an array containing only digits `0-9`, add one to the number and return the array.
+ * E.g. Given `[1, 4, 2, 1]` which represents `1421`, return `[1, 4, 2, 2]` which represents `1422`.
+* Find the second maximum value in an array.
+* Given an array, find the longest arithmetic progression.
+* Rotate an array by an offset of k.
+* Remove duplicates in an unsorted array where the duplicates are at a distance of k or less from each other.
+* Given an unsorted list of integers, return true if the list contains any duplicates within k indices of each element. Do it faster than O(n^2).
+* Given an unsorted list of integers, return true if the list contains any fuzzy duplicates within k indices of each element. A fuzzy duplicate is another integer within d of the original integer. Do it faster than O(n^2).
+ * E.g. If d = 4, then 6 is a fuzzy duplicate of 3 but 8 is not.
+* Say you have an unordered list of numbers ranging from 1 to n, and one of the numbers is removed, how do you find that number? What if two numbers are removed?
+* Given an array of string, find the duplicated elements.
+ * [Source](http://blog.gainlo.co/index.php/2016/05/10/duplicate-elements-of-an-array/).
+* Given an array of integers, find a maximum sum of non-adjacent elements.
+ * E.g. `[1, 0, 3, 9, 2]` should return `10 (1 + 9)`.
+ * [Source](http://blog.gainlo.co/index.php/2016/12/02/uber-interview-question-maximum-sum-non-adjacent-elements/)
+* Given an array of integers, modify the array by moving all the zeros to the end (right side). The order of other elements doesn't matter.
+ * E.g. `[1, 2, 0, 3, 0, 1, 2]`, the program can output `[1, 2, 3, 1, 2, 0, 0]`.
+ * [Source](http://blog.gainlo.co/index.php/2016/11/18/uber-interview-question-move-zeroes/).
+* Given an array, return the length of the longest increasing contiguous subarray.
+ * E.g., `[1, 3, 2, 3, 4, 8, 7, 9]`, should return `4` because the longest increasing array is `[2, 3, 4, 8]`.
+ * [Source](http://blog.gainlo.co/index.php/2017/02/02/uber-interview-questions-longest-increasing-subarray/).
+* Given an array of integers where every value appears twice except one, find the single, non-repeating value. Follow up: do so with O(1) space.
+ * E.g., `[2, 5, 3, 2, 1, 3, 4, 5, 1]` returns 4, because it is the only value that appears in the array only once.
diff --git a/algorithms/bit-manipulation.md b/algorithms/bit-manipulation.md
index 76aa4153..75518bbf 100644
--- a/algorithms/bit-manipulation.md
+++ b/algorithms/bit-manipulation.md
@@ -1,7 +1,6 @@
-Bit Manipulation
-==
+# Bit Manipulation
-- How do you verify if an interger is a power of 2?
-- Write a program to print the binary representation of an integer.
-- Write a program to print out the number of 1 bits in a given integer.
-- Write a program to determine the largest possible integer using the same number of 1 bits in a given number.
+* How do you verify if an interger is a power of 2?
+* Write a program to print the binary representation of an integer.
+* Write a program to print out the number of 1 bits in a given integer.
+* Write a program to determine the largest possible integer using the same number of 1 bits in a given number.
diff --git a/algorithms/dynamic-programming.md b/algorithms/dynamic-programming.md
index 978fa611..3398147e 100644
--- a/algorithms/dynamic-programming.md
+++ b/algorithms/dynamic-programming.md
@@ -1,14 +1,15 @@
-Dynamic Programming
-==
+# Dynamic Programming
-- Given a flight itinerary consisting of starting city, destination city, and ticket price (2D list) - find the optimal price flight path to get from start to destination. (A variation of Dynamic Programming Shortest Path)
-- Given some coin denominations and a target value `M`, return the coins combination with the minimum number of coins.
- - Time complexity: `O(MN)`, where N is the number of distinct type of coins.
- - Space complexity: `O(M)`.
-- Given a set of numbers in an array which represent a number of consecutive days of Airbnb reservation requested, as a host, pick the sequence which maximizes the number of days of occupancy, at the same time, leaving at least a 1-day gap in-between bookings for cleaning.
- - The problem reduces to finding the maximum sum of non-consecutive array elements.
- - E.g.
- ~~~
+* Given a flight itinerary consisting of starting city, destination city, and ticket price (2D list) - find the optimal price flight path to get from start to destination. (A variation of Dynamic Programming Shortest Path)
+* Given some coin denominations and a target value `M`, return the coins combination with the minimum number of coins.
+ * Time complexity: `O(MN)`, where N is the number of distinct type of coins.
+ * Space complexity: `O(M)`.
+* Given a set of numbers in an array which represent a number of consecutive days of Airbnb reservation requested, as a host, pick the sequence which maximizes the number of days of occupancy, at the same time, leaving at least a 1-day gap in-between bookings for cleaning.
+
+ * The problem reduces to finding the maximum sum of non-consecutive array elements.
+ * E.g.
+
+ ```
// [5, 1, 1, 5] => 10
The above array would represent an example booking period as follows -
// Dec 1 - 5
@@ -22,5 +23,6 @@ Dynamic Programming
Similarly,
// [3, 6, 4] => 7
// [4, 10, 3, 1, 5] => 15
- ~~~
-- Given a list of denominations (e.g., `[1, 2, 5]` means you have coins worth $1, $2, and $5) and a target number `k`, find all possible combinations, if any, of coins in the given denominations that add up to `k`. You can use coins of the same denomination more than once.
+ ```
+
+* Given a list of denominations (e.g., `[1, 2, 5]` means you have coins worth $1, $2, and $5) and a target number `k`, find all possible combinations, if any, of coins in the given denominations that add up to `k`. You can use coins of the same denomination more than once.
diff --git a/algorithms/geometry.md b/algorithms/geometry.md
index 062f861b..8b2472ed 100644
--- a/algorithms/geometry.md
+++ b/algorithms/geometry.md
@@ -1,7 +1,6 @@
-Geometry
-==
+# Geometry
-- You have a plane with lots of rectangles on it, find out how many of them intersect.
-- Which data structure would you use to query the k-nearest points of a set on a 2D plane?
-- Given many points, find k points that are closest to the origin.
-- How would you triangulate a polygon?
+* You have a plane with lots of rectangles on it, find out how many of them intersect.
+* Which data structure would you use to query the k-nearest points of a set on a 2D plane?
+* Given many points, find k points that are closest to the origin.
+* How would you triangulate a polygon?
diff --git a/algorithms/graph.md b/algorithms/graph.md
index 119000ba..e1056a71 100644
--- a/algorithms/graph.md
+++ b/algorithms/graph.md
@@ -1,10 +1,9 @@
-Graph
-==
+# Graph
-- Given a list of sorted words from an alien dictionary, find the order of the alphabet.
- - Alien Dictionary Topological Sort question.
-- Find if a given string matches any path in a labeled graph. A path may contain cycles.
-- Given a bipartite graph, separate the vertices into two sets.
-- You are a thief trying to sneak across a rectangular 100 x 100m field. There are alarms placed on the fields and they each have a circular sensing radius which will trigger if anyone steps into it. Each alarm has its own radius. Determine if you can get from one end of the field to the other end.
-- Given a graph and two nodes, determine if there exists a path between them.
-- Determine if a cycle exists in the graph.
+* Given a list of sorted words from an alien dictionary, find the order of the alphabet.
+ * Alien Dictionary Topological Sort question.
+* Find if a given string matches any path in a labeled graph. A path may contain cycles.
+* Given a bipartite graph, separate the vertices into two sets.
+* You are a thief trying to sneak across a rectangular 100 x 100m field. There are alarms placed on the fields and they each have a circular sensing radius which will trigger if anyone steps into it. Each alarm has its own radius. Determine if you can get from one end of the field to the other end.
+* Given a graph and two nodes, determine if there exists a path between them.
+* Determine if a cycle exists in the graph.
diff --git a/algorithms/hash-table.md b/algorithms/hash-table.md
index c8655047..7175d6b1 100644
--- a/algorithms/hash-table.md
+++ b/algorithms/hash-table.md
@@ -1,7 +1,6 @@
-Hash Table
-==
+# Hash Table
-- Describe an implementation of a least-used cache, and big-O notation of it.
-- A question involving an API's integration with hash map where the buckets of hash map are made up of linked lists.
-- Implement data structure `Map` storing pairs of integers (key, value) and define following member functions in O(1) runtime: `void insert(key, value)`, `void delete(key)`, `int get(key)`, `int getRandomKey()`.
- - [Source](http://blog.gainlo.co/index.php/2016/08/14/uber-interview-question-map-implementation/).
+* Describe an implementation of a least-used cache, and big-O notation of it.
+* A question involving an API's integration with hash map where the buckets of hash map are made up of linked lists.
+* Implement data structure `Map` storing pairs of integers (key, value) and define following member functions in O(1) runtime: `void insert(key, value)`, `void delete(key)`, `int get(key)`, `int getRandomKey()`.
+ * [Source](http://blog.gainlo.co/index.php/2016/08/14/uber-interview-question-map-implementation/).
diff --git a/algorithms/heap.md b/algorithms/heap.md
index 1e68064f..72d6d82c 100644
--- a/algorithms/heap.md
+++ b/algorithms/heap.md
@@ -1,5 +1,4 @@
-Heap
-==
+# Heap
-- Merge `K` sorted lists together into a single list.
-- Given a stream of integers, write an efficient function that returns the median value of the integers.
+* Merge `K` sorted lists together into a single list.
+* Given a stream of integers, write an efficient function that returns the median value of the integers.
diff --git a/algorithms/interval.md b/algorithms/interval.md
index 5dd3e373..4826c19e 100644
--- a/algorithms/interval.md
+++ b/algorithms/interval.md
@@ -1,7 +1,7 @@
-Interval
-==
+# Interval
+
+* Given a list of schedules, provide a list of times that are available for a meeting.
-- Given a list of schedules, provide a list of times that are available for a meeting.
```
[
[[4,5], [6,10], [12,14]],
@@ -12,17 +12,17 @@ Interval
Example Output:
[[0,4], [11,12], [16,23]]
```
-- You have a number of meetings (with their start and end times). You need to schedule them using the minimum number of rooms. Return the list of meetings in every room.
-- Interval ranges:
- - Given 2 interval ranges, create a function to tell me if these ranges intersect. Both start and end are inclusive: `[start, end]`
- - E.g. `[1, 4]` and `[5, 6]` => `false`
- - E.g. `[1, 4]` and `[3, 6]` => `true`
- - Given 2 interval ranges that intersect, now create a function to merge the 2 ranges into a single continuous range.
- - E.g. `[1, 4]` and `[3, 6]` => `[1, 6]`
- - Now create a function that takes a group of unsorted, unorganized intervals, merge any intervals that intersect and sort them. The result should be a group of sorted, non-intersecting intervals.
- - Now create a function to merge a new interval into a group of sorted, non-intersecting intervals. After the merge, all intervals should remain
- non-intersecting.
-- Given a list of meeting times, check if any of them overlap. The follow-up question is to return the minimum number of rooms required to accommodate all the meetings.
- - [Source](http://blog.gainlo.co/index.php/2016/07/12/meeting-room-scheduling-problem/)
-- If you have a list of intervals, how would you merge them?
- - E.g. `[1, 3], [8, 11], [2, 6]` => `[1, 6], [8-11]`
+
+* You have a number of meetings (with their start and end times). You need to schedule them using the minimum number of rooms. Return the list of meetings in every room.
+* Interval ranges:
+ * Given 2 interval ranges, create a function to tell me if these ranges intersect. Both start and end are inclusive: `[start, end]`
+ * E.g. `[1, 4]` and `[5, 6]` => `false`
+ * E.g. `[1, 4]` and `[3, 6]` => `true`
+ * Given 2 interval ranges that intersect, now create a function to merge the 2 ranges into a single continuous range.
+ * E.g. `[1, 4]` and `[3, 6]` => `[1, 6]`
+ * Now create a function that takes a group of unsorted, unorganized intervals, merge any intervals that intersect and sort them. The result should be a group of sorted, non-intersecting intervals.
+ * Now create a function to merge a new interval into a group of sorted, non-intersecting intervals. After the merge, all intervals should remain non-intersecting.
+* Given a list of meeting times, check if any of them overlap. The follow-up question is to return the minimum number of rooms required to accommodate all the meetings.
+ * [Source](http://blog.gainlo.co/index.php/2016/07/12/meeting-room-scheduling-problem/)
+* If you have a list of intervals, how would you merge them?
+ * E.g. `[1, 3], [8, 11], [2, 6]` => `[1, 6], [8-11]`
diff --git a/algorithms/linked-list.md b/algorithms/linked-list.md
index 8dd1dbdd..292f45a4 100644
--- a/algorithms/linked-list.md
+++ b/algorithms/linked-list.md
@@ -1,12 +1,11 @@
-Linked List
-==
+# Linked List
-- Given a linked list, in addition to the next pointer, each node has a child pointer that can point to a separate list. With the head node, flatten the list to a single-level linked list.
- - [Source](http://blog.gainlo.co/index.php/2016/06/12/flatten-a-linked-list/)
-- Reverse a singly linked list. Implement it recursively and iteratively.
-- Convert a binary tree to a doubly circular linked list.
-- Implement an LRU cache with O(1) runtime for all its operations.
-- Check distance between values in linked list.
-- A question involving an API's integration with hash map where the buckets of hash map are made up of linked lists.
-- Given a singly linked list (a list which can only be traversed in one direction), find the item that is located at 'k' items from the end. So if the list is a, b, c, d and k is 2 then the answer is 'c'. The solution should not search the list twice.
-- How can you tell if a Linked List is a Palindrome?
+* Given a linked list, in addition to the next pointer, each node has a child pointer that can point to a separate list. With the head node, flatten the list to a single-level linked list.
+ * [Source](http://blog.gainlo.co/index.php/2016/06/12/flatten-a-linked-list/)
+* Reverse a singly linked list. Implement it recursively and iteratively.
+* Convert a binary tree to a doubly circular linked list.
+* Implement an LRU cache with O(1) runtime for all its operations.
+* Check distance between values in linked list.
+* A question involving an API's integration with hash map where the buckets of hash map are made up of linked lists.
+* Given a singly linked list (a list which can only be traversed in one direction), find the item that is located at 'k' items from the end. So if the list is a, b, c, d and k is 2 then the answer is 'c'. The solution should not search the list twice.
+* How can you tell if a Linked List is a Palindrome?
diff --git a/algorithms/math.md b/algorithms/math.md
index fdff1ce5..dec116ea 100644
--- a/algorithms/math.md
+++ b/algorithms/math.md
@@ -1,20 +1,19 @@
-Math
-==
+# Math
-- Create a square root function.
-- Given a string such as "123" or "67", write a function to output the number represented by the string without using casting.
-- Make a program that can print out the text form of numbers from 1 - 1000 (ex. 20 is "twenty", 105 is "one hundred and five").
-- Write a function that parses Roman numerals.
- - E.g. `XIV` returns `14`.
-- Write in words for a given digit.
- - E.g. `123` returns `one hundred and twenty three`.
-- Given a number `N`, find the largest number just smaller than `N` that can be formed using the same digits as `N`.
-- Compute the square root of `N` without using any existing functions.
-- Given numbers represented as binary strings, and return the string containing their sum.
- - E.g. `add('10010', '101')` returns `'10111'`.
-- Take in an integer and return its english word-format.
- - E.g. 1 -> "one", -10,203 -> "negative ten thousand two hundred and three".
-- Write a function that returns values randomly, according to their weight. Suppose we have 3 elements with their weights: A (1), B (1) and C (2). The function should return A with probability 25%, B with 25% and C with 50% based on the weights.
- - [Source](http://blog.gainlo.co/index.php/2016/11/11/uber-interview-question-weighted-random-numbers/)
-- Given a number, how can you get the next greater number with the same set of digits?
- - [Source](http://blog.gainlo.co/index.php/2017/01/20/arrange-given-numbers-to-form-the-biggest-number-possible/)
+* Create a square root function.
+* Given a string such as "123" or "67", write a function to output the number represented by the string without using casting.
+* Make a program that can print out the text form of numbers from 1 - 1000 (ex. 20 is "twenty", 105 is "one hundred and five").
+* Write a function that parses Roman numerals.
+ * E.g. `XIV` returns `14`.
+* Write in words for a given digit.
+ * E.g. `123` returns `one hundred and twenty three`.
+* Given a number `N`, find the largest number just smaller than `N` that can be formed using the same digits as `N`.
+* Compute the square root of `N` without using any existing functions.
+* Given numbers represented as binary strings, and return the string containing their sum.
+ * E.g. `add('10010', '101')` returns `'10111'`.
+* Take in an integer and return its english word-format.
+ * E.g. 1 -> "one", -10,203 -> "negative ten thousand two hundred and three".
+* Write a function that returns values randomly, according to their weight. Suppose we have 3 elements with their weights: A (1), B (1) and C (2). The function should return A with probability 25%, B with 25% and C with 50% based on the weights.
+ * [Source](http://blog.gainlo.co/index.php/2016/11/11/uber-interview-question-weighted-random-numbers/)
+* Given a number, how can you get the next greater number with the same set of digits?
+ * [Source](http://blog.gainlo.co/index.php/2017/01/20/arrange-given-numbers-to-form-the-biggest-number-possible/)
diff --git a/algorithms/matrix.md b/algorithms/matrix.md
index a0977e9e..3d3ad219 100644
--- a/algorithms/matrix.md
+++ b/algorithms/matrix.md
@@ -1,18 +1,17 @@
-Matrix
-==
+# Matrix
-- You're given a 3 x 3 board of a tile puzzle, with 8 tiles numbered 1 to 8, and an empty spot. You can move any tile adjacent to the empty spot, to the empty spot, creating an empty spot where the tile originally was. The goal is to find a series of moves that will solve the board, i.e. get `[[1, 2, 3], [4, 5, 6], [7, 8, - ]]` where - is the empty tile.
-- Boggle implementation. Given a dictionary, and a matrix of letters, find all the words in the matrix that are in the dictionary. You can go across, down or diagonally.
-- The values of the matrix will represent numbers of carrots available to the rabbit in each square of the garden. If the garden does not have an exact center, the rabbit should start in the square closest to the center with the highest carrot count. On a given turn, the rabbit will eat the carrots available on the square that it is on, and then move up, down, left, or right, choosing the square that has the most carrots. If there are no carrots left on any of the adjacent squares, the rabbit will go to sleep. You may assume that the rabbit will never have to choose between two squares with the same number of carrots. Write a function which takes a garden matrix and returns the number of carrots the rabbit eats. You may assume the matrix is rectangular with at least 1 row and 1 column, and that it is populated with non-negative integers. For example,
- - Example: `[[5, 7, 8, 6, 3], [0, 0, 7, 0, 4], [4, 6, 3, 4, 9], [3, 1, 0, 5, 8]]` should return `27`.
-- Print a matrix in a spiral fashion.
-- In the Game of life, calculate how to compute the next state of the board. Follow up was to do it if there were memory constraints (board represented by a 1 TB file).
-- Grid Illumination: Given an NxN grid with an array of lamp coordinates. Each lamp provides illumination to every square on their x axis, every square on their y axis, and every square that lies in their diagonal (think of a Queen in chess). Given an array of query coordinates, determine whether that point is illuminated or not. The catch is when checking a query all lamps adjacent to, or on, that query get turned off. The ranges for the variables/arrays were about: 10^3 < N < 10^9, 10^3 < lamps < 10^9, 10^3 < queries < 10^9.
-- You are given a matrix of integers. Modify the matrix such that if a row or column contains a 0, make the values in the entire row or column 0.
-- Given an N x N matrix filled randomly with different colors (no limit on what the colors are), find the total number of groups of each color - a group consists of adjacent cells of the same color touching each other.
-- You have a 4 x 4 board with characters. You need to write a function that finds if a certain word exists in the board. You can only jump to neighboring characters (including diagonally adjacent).
-- Count the number of islands in a binary matrix of 0's and 1's.
-- Check a 6 x 7 Connect 4 board for a winning condition.
-- Given a fully-filled Sudoku board, check whether fulfills the Sudoku condition.
-- Implement a function that checks if a player has won tic-tac-toe.
-- Given an N x N matrix of 1's and 0's, figure out if all of the 1's are connected.
+* You're given a 3 x 3 board of a tile puzzle, with 8 tiles numbered 1 to 8, and an empty spot. You can move any tile adjacent to the empty spot, to the empty spot, creating an empty spot where the tile originally was. The goal is to find a series of moves that will solve the board, i.e. get `[[1, 2, 3], [4, 5, 6], [7, 8, - ]]` where - is the empty tile.
+* Boggle implementation. Given a dictionary, and a matrix of letters, find all the words in the matrix that are in the dictionary. You can go across, down or diagonally.
+* The values of the matrix will represent numbers of carrots available to the rabbit in each square of the garden. If the garden does not have an exact center, the rabbit should start in the square closest to the center with the highest carrot count. On a given turn, the rabbit will eat the carrots available on the square that it is on, and then move up, down, left, or right, choosing the square that has the most carrots. If there are no carrots left on any of the adjacent squares, the rabbit will go to sleep. You may assume that the rabbit will never have to choose between two squares with the same number of carrots. Write a function which takes a garden matrix and returns the number of carrots the rabbit eats. You may assume the matrix is rectangular with at least 1 row and 1 column, and that it is populated with non-negative integers. For example,
+ * Example: `[[5, 7, 8, 6, 3], [0, 0, 7, 0, 4], [4, 6, 3, 4, 9], [3, 1, 0, 5, 8]]` should return `27`.
+* Print a matrix in a spiral fashion.
+* In the Game of life, calculate how to compute the next state of the board. Follow up was to do it if there were memory constraints (board represented by a 1 TB file).
+* Grid Illumination: Given an NxN grid with an array of lamp coordinates. Each lamp provides illumination to every square on their x axis, every square on their y axis, and every square that lies in their diagonal (think of a Queen in chess). Given an array of query coordinates, determine whether that point is illuminated or not. The catch is when checking a query all lamps adjacent to, or on, that query get turned off. The ranges for the variables/arrays were about: 10^3 < N < 10^9, 10^3 < lamps < 10^9, 10^3 < queries < 10^9.
+* You are given a matrix of integers. Modify the matrix such that if a row or column contains a 0, make the values in the entire row or column 0.
+* Given an N x N matrix filled randomly with different colors (no limit on what the colors are), find the total number of groups of each color - a group consists of adjacent cells of the same color touching each other.
+* You have a 4 x 4 board with characters. You need to write a function that finds if a certain word exists in the board. You can only jump to neighboring characters (including diagonally adjacent).
+* Count the number of islands in a binary matrix of 0's and 1's.
+* Check a 6 x 7 Connect 4 board for a winning condition.
+* Given a fully-filled Sudoku board, check whether fulfills the Sudoku condition.
+* Implement a function that checks if a player has won tic-tac-toe.
+* Given an N x N matrix of 1's and 0's, figure out if all of the 1's are connected.
diff --git a/algorithms/oop.md b/algorithms/oop.md
index 0df9cc2d..a9d1f20b 100644
--- a/algorithms/oop.md
+++ b/algorithms/oop.md
@@ -1,8 +1,7 @@
-Object-Oriented Programming
-==
+# Object-Oriented Programming
-- How would you design a chess game? What classes and objects would you use? What methods would they have?
-- How would you design the data structures for a book keeping system for a library?
-- Explain how you would design a HTTP server? Give examples of classes, methods, and interfaces. What are the challenges here?
-- Discuss algorithms and data structures for a garbage collector?
-- How would you implement an HR system to keep track of employee salaries and benefits?
+* How would you design a chess game? What classes and objects would you use? What methods would they have?
+* How would you design the data structures for a book keeping system for a library?
+* Explain how you would design a HTTP server? Give examples of classes, methods, and interfaces. What are the challenges here?
+* Discuss algorithms and data structures for a garbage collector?
+* How would you implement an HR system to keep track of employee salaries and benefits?
diff --git a/algorithms/permutation.md b/algorithms/permutation.md
index 00116bf6..3c51fd10 100644
--- a/algorithms/permutation.md
+++ b/algorithms/permutation.md
@@ -1,12 +1,11 @@
-Permutation
-==
+# Permutation
-- You are given a 7 digit phone number, and you should find all possible letter combinations based on the digit-to-letter mapping on numeric pad and return only the ones that have valid match against a given dictionary of words.
-- Give all possible letter combinations from a phone number.
-- Generate all subsets of a string.
-- Print all possible `N` pairs of balanced parentheses.
- - E.g. when `N` is `2`, the function should print `(())` and `()()`.
- - E.g. when `N` is `3`, we should get `((()))`, `(()())`, `(())()`, `()(())`, `()()()`.
- - [Source](http://blog.gainlo.co/index.php/2016/12/23/uber-interview-questions-permutations-parentheses/)
-- Given a list of arrays, return a list of arrays, where each array is a combination of one element in each given array.
- - E.g. If the input is `[[1, 2, 3], [4], [5, 6]]`, the output should be `[[1, 4, 5], [1, 4, 6], [2, 4, 5], [2, 4, 6], [3, 4, 5], [3, 4, 6]]`.
+* You are given a 7 digit phone number, and you should find all possible letter combinations based on the digit-to-letter mapping on numeric pad and return only the ones that have valid match against a given dictionary of words.
+* Give all possible letter combinations from a phone number.
+* Generate all subsets of a string.
+* Print all possible `N` pairs of balanced parentheses.
+ * E.g. when `N` is `2`, the function should print `(())` and `()()`.
+ * E.g. when `N` is `3`, we should get `((()))`, `(()())`, `(())()`, `()(())`, `()()()`.
+ * [Source](http://blog.gainlo.co/index.php/2016/12/23/uber-interview-questions-permutations-parentheses/)
+* Given a list of arrays, return a list of arrays, where each array is a combination of one element in each given array.
+ * E.g. If the input is `[[1, 2, 3], [4], [5, 6]]`, the output should be `[[1, 4, 5], [1, 4, 6], [2, 4, 5], [2, 4, 6], [3, 4, 5], [3, 4, 6]]`.
diff --git a/algorithms/queue.md b/algorithms/queue.md
index 31612de9..46ff1fe4 100644
--- a/algorithms/queue.md
+++ b/algorithms/queue.md
@@ -1,5 +1,4 @@
-Queue
-==
+# Queue
-- Implement a Queue class from scratch with an existing bug, the bug is that it cannot take more than 5 elements.
-- Implement a Queue using two stacks. You may only use the standard `push()`, `pop()`, and `peek()` operations traditionally available to stacks. You do not need to implement the stack yourself (i.e. an array can be used to simulate a stack).
+* Implement a Queue class from scratch with an existing bug, the bug is that it cannot take more than 5 elements.
+* Implement a Queue using two stacks. You may only use the standard `push()`, `pop()`, and `peek()` operations traditionally available to stacks. You do not need to implement the stack yourself (i.e. an array can be used to simulate a stack).
diff --git a/algorithms/sorting-searching.md b/algorithms/sorting-searching.md
index 4b36ba95..e6457d7c 100644
--- a/algorithms/sorting-searching.md
+++ b/algorithms/sorting-searching.md
@@ -1,16 +1,15 @@
-Sorting and Searching
-==
+# Sorting and Searching
-- Sorting search results on a page given a certain set of criteria.
-- Sort a list of numbers in which each number is at a distance `K` from its actual position.
-- Given an array of integers, sort the array so that all odd indexes are greater than the even indexes.
-- Given users with locations in a list and a logged-in user with locations, find their travel buddies (people who shared more than half of your locations).
-- Search for an element in a sorted and rotated array.
- - [Source](http://blog.gainlo.co/index.php/2017/01/12/rotated-array-binary-search/)
-- Sort a list where each element is no more than k positions away from its sorted position.
-- Search for an item in a sorted, but rotated, array.
-- Merge two sorted lists together.
-- Give 3 distinct algorithms to find the K largest values in a list of N items.
-- Find the minimum element in a sorted rotated array in faster than O(n) time.
-- Write a function that takes a number as input and outputs the biggest number with the same set of digits.
- - [Source](http://blog.gainlo.co/index.php/2017/01/20/arrange-given-numbers-to-form-the-biggest-number-possible/)
+* Sorting search results on a page given a certain set of criteria.
+* Sort a list of numbers in which each number is at a distance `K` from its actual position.
+* Given an array of integers, sort the array so that all odd indexes are greater than the even indexes.
+* Given users with locations in a list and a logged-in user with locations, find their travel buddies (people who shared more than half of your locations).
+* Search for an element in a sorted and rotated array.
+ * [Source](http://blog.gainlo.co/index.php/2017/01/12/rotated-array-binary-search/)
+* Sort a list where each element is no more than k positions away from its sorted position.
+* Search for an item in a sorted, but rotated, array.
+* Merge two sorted lists together.
+* Give 3 distinct algorithms to find the K largest values in a list of N items.
+* Find the minimum element in a sorted rotated array in faster than O(n) time.
+* Write a function that takes a number as input and outputs the biggest number with the same set of digits.
+ * [Source](http://blog.gainlo.co/index.php/2017/01/20/arrange-given-numbers-to-form-the-biggest-number-possible/)
diff --git a/algorithms/stack.md b/algorithms/stack.md
index 063e3a64..ca7bbda8 100644
--- a/algorithms/stack.md
+++ b/algorithms/stack.md
@@ -1,9 +1,8 @@
-Stack
-==
+# Stack
-- Implementation of an interpreter for a small language that does multiplication/addition/etc.
-- Design a `MinStack` data structure that supports a `min()` operation that returns the minimum value in the stack in O(1) time.
-- Write an algorithm to determine if all of the delimiters in an expression are matched and closed.
- - E.g. `{ac[bb]}`, `[dklf(df(kl))d]{}` and `{[[[]]]}` are matched. But `{3234[fd` and `{df][d}` are not.
- - [Source](http://blog.gainlo.co/index.php/2016/09/30/uber-interview-question-delimiter-matching/)
-- Sort a stack in ascending order using an additional stack.
+* Implementation of an interpreter for a small language that does multiplication/addition/etc.
+* Design a `MinStack` data structure that supports a `min()` operation that returns the minimum value in the stack in O(1) time.
+* Write an algorithm to determine if all of the delimiters in an expression are matched and closed.
+ * E.g. `{ac[bb]}`, `[dklf(df(kl))d]{}` and `{[[[]]]}` are matched. But `{3234[fd` and `{df][d}` are not.
+ * [Source](http://blog.gainlo.co/index.php/2016/09/30/uber-interview-question-delimiter-matching/)
+* Sort a stack in ascending order using an additional stack.
diff --git a/algorithms/string.md b/algorithms/string.md
index 247aea05..eaae3c5c 100644
--- a/algorithms/string.md
+++ b/algorithms/string.md
@@ -1,58 +1,57 @@
-String
-==
+# String
-- Output list of strings representing a page of hostings given a list of CSV strings.
-- Given a list of words, find the word pairs that when concatenated form a palindrome.
-- Find the most efficient way to identify what character is out of place in a non-palindrome.
-- Implement a simple regex parser which, given a string and a pattern, returns a boolean indicating whether the input matches the pattern. By simple, we mean that the regex can only contain the following special characters: `*` (star), `.` (dot), `+` (plus). The star means that there will be zero or more of the previous character in that place in the pattern. The dot means any character for that position. The plus means one or more of previous character in that place in the pattern.
-- Find all words from a dictionary that are x edit distance away.
-- Given a string IP and number n, print all CIDR addresses that cover that range.
-- Write a function called `eval`, which takes a string and returns a boolean. This string is allowed 6 different characters: `0`, `1`, `&`, `|`, `(`, and `)`. `eval` should evaluate the string as a boolean expression, where `0` is `false`, `1` is `true`, `&` is an `and`, and `|` is an `or`.
- - E.g `"(0 | (1 | 0)) & (1 & ((1 | 0) & 0))"`
-- Given a pattern string like `"abba"` and an input string like `"redbluebluered"`, return `true` if and only if there's a one to one mapping of letters in the pattern to substrings of the input.
- - E.g. `"abba"` and `"redbluebluered"` should return `true`.
- - E.g. `"aaaa"` and `"asdasdasdasd"` should return `true`.
- - E.g. `"aabb"` and `"xyzabcxzyabc"` should return `false`.
-- If you received a file in chunks, calculate when you have the full file. Quite an open-ended question. Can assume chunks come with start and end, or size, etc.
-- Given a list of names (strings) and the width of a line, design an algorithm to display them using the minimum number of lines.
-- Design a spell-checking algorithm.
-- Count and say problem.
-- Longest substring with `K` unique characters.
- - [Source](http://blog.gainlo.co/index.php/2016/04/12/find-the-longest-substring-with-k-unique-characters/)
-- Given a set of random strings, write a function that returns a set that groups all the anagrams together.
- - [Source](http://blog.gainlo.co/index.php/2016/05/06/group-anagrams/)
-- Given a string, find the longest substring without repeating characters. For example, for string `'abccdefgh'`, the longest substring is `'cdefgh'`.
- - [Source](http://blog.gainlo.co/index.php/2016/10/07/facebook-interview-longest-substring-without-repeating-characters/)
-- Given a string, return the string with duplicate characters removed.
-- Write a function that receives a regular expression (allowed chars = from `'a'` to `'z'`, `'*'`, `'.'`) and a string containing lower case english alphabet characters and return `true` or `false` whether the string matches the regex.
- - E.g. `'ab*a'`, `'abbbbba'` => `true`.
- - E.g. `'ab*b.'`, `'aba'` => `true`.
- - E.g. `'abc*'`, `'acccc'` => `false`.
-- Given a rectangular grid with letters, search if some word is in the grid.
-- Given two strings representing integer numbers (`'123'` , `'30'`) return a string representing the sum of the two numbers: `'153'`.
-- A professor wants to see if two students have cheated when writing a paper. Design a function `hasCheated(String s1, String s2, int N)` that evaluates to `true` if two strings have a common substring of length `N`.
- - Follow up: Assume you don't have the possibility of using `String.contains()` and `String.substring()`. How would you implement this?
-- Print all permutations of a given string.
-- Parse a string containing numbers and `'+'`, `'-'` and parentheses. Evaluate the expression. `-2+(3-5)` should return `-4`.
-- Output a substring with at most `K` unique characters.
- - E.g. `'aabc'` and `k` = 2 => `'aab'`.
-- Ensure that there are a minimum of `N` dashes between any two of the same characters of a string.
- - E.g. `n = 2, string = 'ab-bcdecca'` => `'ab--bcdec--ca'`.
-- Find the longest palindrome in a string.
-- Give the count and the number following in the series.
- - E.g. `1122344`, next: `21221324`, next: `12112211121214`.
- - Count and say problem.
-- Compress a string by grouping consecutive similar questions together:
- - E.g. `'aaabbbcc' => `'a3b3c2'`.
-- You have a string consisting of open and closed parentheses, but parentheses may be imbalanced. Make the parentheses balanced and return the new string.
-- Given a set of strings, return the smallest subset that contains prefixes for every string.
- - E.g. `['foo', 'foog', 'food', 'asdf']` => `['foo', 'asdf']`.
-- Write a function that would return all the possible words generated when using a phone (pre-smartphone era) numpad to type.
-- Given a dictionary and a word, find the minimum number of deletions needed on the word in order to make it a valid word.
- - [Source](http://blog.gainlo.co/index.php/2016/04/29/minimum-number-of-deletions-of-a-string/)
-- How to check if a string contains an anagram of another string?
- - [Source](http://blog.gainlo.co/index.php/2016/04/08/if-a-string-contains-an-anagram-of-another-string/)
-- Find all k-lettered words from a string.
-- Given a string of open and close parentheses, find the minimum number of edits needed to balance a string of parentheses.
-- Run length encoding - Write a string compress function that returns `'R2G1B1'` given `'RRGB'`.
-- Write a function that finds all the different ways you can split up a word into a concatenation of two other words.
+* Output list of strings representing a page of hostings given a list of CSV strings.
+* Given a list of words, find the word pairs that when concatenated form a palindrome.
+* Find the most efficient way to identify what character is out of place in a non-palindrome.
+* Implement a simple regex parser which, given a string and a pattern, returns a boolean indicating whether the input matches the pattern. By simple, we mean that the regex can only contain the following special characters: `*` (star), `.` (dot), `+` (plus). The star means that there will be zero or more of the previous character in that place in the pattern. The dot means any character for that position. The plus means one or more of previous character in that place in the pattern.
+* Find all words from a dictionary that are x edit distance away.
+* Given a string IP and number n, print all CIDR addresses that cover that range.
+* Write a function called `eval`, which takes a string and returns a boolean. This string is allowed 6 different characters: `0`, `1`, `&`, `|`, `(`, and `)`. `eval` should evaluate the string as a boolean expression, where `0` is `false`, `1` is `true`, `&` is an `and`, and `|` is an `or`.
+ * E.g `"(0 | (1 | 0)) & (1 & ((1 | 0) & 0))"`
+* Given a pattern string like `"abba"` and an input string like `"redbluebluered"`, return `true` if and only if there's a one to one mapping of letters in the pattern to substrings of the input.
+ * E.g. `"abba"` and `"redbluebluered"` should return `true`.
+ * E.g. `"aaaa"` and `"asdasdasdasd"` should return `true`.
+ * E.g. `"aabb"` and `"xyzabcxzyabc"` should return `false`.
+* If you received a file in chunks, calculate when you have the full file. Quite an open-ended question. Can assume chunks come with start and end, or size, etc.
+* Given a list of names (strings) and the width of a line, design an algorithm to display them using the minimum number of lines.
+* Design a spell-checking algorithm.
+* Count and say problem.
+* Longest substring with `K` unique characters.
+ * [Source](http://blog.gainlo.co/index.php/2016/04/12/find-the-longest-substring-with-k-unique-characters/)
+* Given a set of random strings, write a function that returns a set that groups all the anagrams together.
+ * [Source](http://blog.gainlo.co/index.php/2016/05/06/group-anagrams/)
+* Given a string, find the longest substring without repeating characters. For example, for string `'abccdefgh'`, the longest substring is `'cdefgh'`.
+ * [Source](http://blog.gainlo.co/index.php/2016/10/07/facebook-interview-longest-substring-without-repeating-characters/)
+* Given a string, return the string with duplicate characters removed.
+* Write a function that receives a regular expression (allowed chars = from `'a'` to `'z'`, `'*'`, `'.'`) and a string containing lower case english alphabet characters and return `true` or `false` whether the string matches the regex.
+ * E.g. `'ab*a'`, `'abbbbba'` => `true`.
+ * E.g. `'ab*b.'`, `'aba'` => `true`.
+ * E.g. `'abc*'`, `'acccc'` => `false`.
+* Given a rectangular grid with letters, search if some word is in the grid.
+* Given two strings representing integer numbers (`'123'` , `'30'`) return a string representing the sum of the two numbers: `'153'`.
+* A professor wants to see if two students have cheated when writing a paper. Design a function `hasCheated(String s1, String s2, int N)` that evaluates to `true` if two strings have a common substring of length `N`.
+ * Follow up: Assume you don't have the possibility of using `String.contains()` and `String.substring()`. How would you implement this?
+* Print all permutations of a given string.
+* Parse a string containing numbers and `'+'`, `'-'` and parentheses. Evaluate the expression. `-2+(3-5)` should return `-4`.
+* Output a substring with at most `K` unique characters.
+ * E.g. `'aabc'` and `k` = 2 => `'aab'`.
+* Ensure that there are a minimum of `N` dashes between any two of the same characters of a string.
+ * E.g. `n = 2, string = 'ab-bcdecca'` => `'ab--bcdec--ca'`.
+* Find the longest palindrome in a string.
+* Give the count and the number following in the series.
+ * E.g. `1122344`, next: `21221324`, next: `12112211121214`.
+ * Count and say problem.
+* Compress a string by grouping consecutive similar questions together:
+ * E.g. `'aaabbbcc' =>`'a3b3c2'`.
+* You have a string consisting of open and closed parentheses, but parentheses may be imbalanced. Make the parentheses balanced and return the new string.
+* Given a set of strings, return the smallest subset that contains prefixes for every string.
+ * E.g. `['foo', 'foog', 'food', 'asdf']` => `['foo', 'asdf']`.
+* Write a function that would return all the possible words generated when using a phone (pre-smartphone era) numpad to type.
+* Given a dictionary and a word, find the minimum number of deletions needed on the word in order to make it a valid word.
+ * [Source](http://blog.gainlo.co/index.php/2016/04/29/minimum-number-of-deletions-of-a-string/)
+* How to check if a string contains an anagram of another string?
+ * [Source](http://blog.gainlo.co/index.php/2016/04/08/if-a-string-contains-an-anagram-of-another-string/)
+* Find all k-lettered words from a string.
+* Given a string of open and close parentheses, find the minimum number of edits needed to balance a string of parentheses.
+* Run length encoding - Write a string compress function that returns `'R2G1B1'` given `'RRGB'`.
+* Write a function that finds all the different ways you can split up a word into a concatenation of two other words.
diff --git a/algorithms/topics.md b/algorithms/topics.md
index 9718e7e7..fae89d82 100644
--- a/algorithms/topics.md
+++ b/algorithms/topics.md
@@ -1,27 +1,26 @@
-Topics
-==
+# Topics
## Arrays
## Strings
-- Prefix trees (Tries)
-- Suffix trees
-- Suffix arrays
-- KMP
-- Rabin-Karp
-- Boyer-Moore
+* Prefix trees (Tries)
+* Suffix trees
+* Suffix arrays
+* KMP
+* Rabin-Karp
+* Boyer-Moore
## Sorting
-- Bubble sort
-- Insertion sort
-- Merge sort
-- Quick sort
-- Selection sort
-- Bucket sort
-- Radix sort
-- Counting sort
+* Bubble sort
+* Insertion sort
+* Merge sort
+* Quick sort
+* Selection sort
+* Bucket sort
+* Radix sort
+* Counting sort
## Linked Lists
@@ -31,59 +30,59 @@ Topics
## Hash tables
-- Collision resolution algorithms
+* Collision resolution algorithms
## Trees
-- BFS
-- DFS (inorder, postorder, preorder)
-- Height
+* BFS
+* DFS (inorder, postorder, preorder)
+* Height
## Binary Search Trees
-- Insert node
-- Delete a node
-- Find element in BST
-- Find min, max element in BST
-- Get successor element in tree
-- Check if a binary tree is a BST or not
+* Insert node
+* Delete a node
+* Find element in BST
+* Find min, max element in BST
+* Get successor element in tree
+* Check if a binary tree is a BST or not
## Heaps / Priority Queues
-- Insert
-- Bubble up
-- Extract max
-- Remove
-- Heapify
-- Heap sort
+* Insert
+* Bubble up
+* Extract max
+* Remove
+* Heapify
+* Heap sort
## Graphs
-- Various implementations
- - Adjacency matrix
- - Adjacency list
- - Adjacency map
-- Single-source shortest path
-- Dijkstra
-- Bellman-Ford
-- Topo sort
-- MST
-- Prim algorithm
-- Kruskal's algorithm
-- Union Find Data Structure
-- Count connected components in a graph
-- List strongly connected components in a graph
-- Check for bipartite graph
+* Various implementations
+ * Adjacency matrix
+ * Adjacency list
+ * Adjacency map
+* Single-source shortest path
+* Dijkstra
+* Bellman-Ford
+* Topo sort
+* MST
+* Prim algorithm
+* Kruskal's algorithm
+* Union Find Data Structure
+* Count connected components in a graph
+* List strongly connected components in a graph
+* Check for bipartite graph
## Dynamic Programming
-- Count Change
-- 0-1 Knapsack
+* Count Change
+* 0-1 Knapsack
## System Design
-- http://www.hiredintech.com/system-design/
-- https://www.quora.com/How-do-I-prepare-to-answer-design-questions-in-a-technical-interview?redirected_qid=1500023
-- http://blog.gainlo.co/index.php/2015/10/22/8-things-you-need-to-know-before-system-design-interviews/
-- https://github.com/donnemartin/system-design-primer
-- https://github.com/jwasham/coding-interview-university/blob/master/extras/cheat%20sheets/system-design.pdf
+* http://www.hiredintech.com/system-design/
+* https://www.quora.com/How-do-I-prepare-to-answer-design-questions-in-a-technical-interview?redirected_qid=1500023
+* http://blog.gainlo.co/index.php/2015/10/22/8-things-you-need-to-know-before-system-design-interviews/
+* https://github.com/donnemartin/system-design-primer
+* https://github.com/jwasham/coding-interview-university/blob/master/extras/cheat%20sheets/system-design.pdf
diff --git a/algorithms/tree.md b/algorithms/tree.md
index be7720db..7a687d4f 100644
--- a/algorithms/tree.md
+++ b/algorithms/tree.md
@@ -1,36 +1,35 @@
-Tree
-==
+# Tree
-- Find the height of a tree.
-- Find the longest path from the root to leaf in a tree.
-- Find the deepest left leaf of a tree.
-- Print all paths of a binary tree.
- - [Source](http://blog.gainlo.co/index.php/2016/04/15/print-all-paths-of-a-binary-tree/)
-- Second largest element of a BST.
- - [Source](http://blog.gainlo.co/index.php/2016/06/03/second-largest-element-of-a-binary-search-tree/)
-- Given a binary tree and two nodes, how to find the common ancestor of the two nodes?
- - [Source](http://blog.gainlo.co/index.php/2016/07/06/lowest-common-ancestor/)
-- Find the lowest common ancestor of two nodes in a binary search tree.
-- Print the nodes in an n-ary tree level by level, one printed line per level.
-- Given a directory of files and folders (and relevant functions), how would you parse through it to find equivalent files?
-- Write a basic file system and implement the commands ls, pwd, mkdir, create, rm, cd, cat, mv.
-- Compute the intersection of two binary search trees.
-- Given a binary tree, output all the node to leaf paths of it.
-- Given a string of characters without spaces, is there a way to break the string into valid words without leftover characters?
-- Print a binary tree level by level.
-- Determine if a binary tree is "complete" (i.e, if all leaf nodes were either at the maximum depth or max depth-1, and were 'pressed' along the left side of the tree).
-- Find the longest path in a binary tree. The path may start and end at any node.
-- Determine if a binary tree is a BST.
-- Given a binary tree, serialize it into a string. Then deserialize it.
-- Print a binary tree by column.
-- Given a node, find the next element in a BST.
-- Find the shortest subtree that consist of all the deepest nodes. The tree is not binary.
-- Print out the sum of each row in a binary tree.
-- Pretty print a JSON object.
-- Convert a binary tree to a doubly circular linked list.
-- Find the second largest number in a binary tree.
-- Given a tree, find the longest branch.
-- Convert a tree to a linked list.
-- Given two trees, write code to find out if tree A is a subtree of tree B.
-- Deepest node in a tree.
- - [Source](http://blog.gainlo.co/index.php/2016/04/26/deepest-node-in-a-tree/)
+* Find the height of a tree.
+* Find the longest path from the root to leaf in a tree.
+* Find the deepest left leaf of a tree.
+* Print all paths of a binary tree.
+ * [Source](http://blog.gainlo.co/index.php/2016/04/15/print-all-paths-of-a-binary-tree/)
+* Second largest element of a BST.
+ * [Source](http://blog.gainlo.co/index.php/2016/06/03/second-largest-element-of-a-binary-search-tree/)
+* Given a binary tree and two nodes, how to find the common ancestor of the two nodes?
+ * [Source](http://blog.gainlo.co/index.php/2016/07/06/lowest-common-ancestor/)
+* Find the lowest common ancestor of two nodes in a binary search tree.
+* Print the nodes in an n-ary tree level by level, one printed line per level.
+* Given a directory of files and folders (and relevant functions), how would you parse through it to find equivalent files?
+* Write a basic file system and implement the commands ls, pwd, mkdir, create, rm, cd, cat, mv.
+* Compute the intersection of two binary search trees.
+* Given a binary tree, output all the node to leaf paths of it.
+* Given a string of characters without spaces, is there a way to break the string into valid words without leftover characters?
+* Print a binary tree level by level.
+* Determine if a binary tree is "complete" (i.e, if all leaf nodes were either at the maximum depth or max depth-1, and were 'pressed' along the left side of the tree).
+* Find the longest path in a binary tree. The path may start and end at any node.
+* Determine if a binary tree is a BST.
+* Given a binary tree, serialize it into a string. Then deserialize it.
+* Print a binary tree by column.
+* Given a node, find the next element in a BST.
+* Find the shortest subtree that consist of all the deepest nodes. The tree is not binary.
+* Print out the sum of each row in a binary tree.
+* Pretty print a JSON object.
+* Convert a binary tree to a doubly circular linked list.
+* Find the second largest number in a binary tree.
+* Given a tree, find the longest branch.
+* Convert a tree to a linked list.
+* Given two trees, write code to find out if tree A is a subtree of tree B.
+* Deepest node in a tree.
+ * [Source](http://blog.gainlo.co/index.php/2016/04/26/deepest-node-in-a-tree/)
diff --git a/design/README.md b/design/README.md
index 7cdbc88e..f35c7f64 100644
--- a/design/README.md
+++ b/design/README.md
@@ -1,94 +1,93 @@
-Design Questions
-==
+# Design Questions
## Guides
-- https://github.com/donnemartin/system-design-primer
-- https://github.com/checkcheckzz/system-design-interview
-- https://github.com/shashank88/system_design
-- https://gist.github.com/vasanthk/485d1c25737e8e72759f
-- http://www.puncsky.com/blog/2016/02/14/crack-the-system-design-interview/
-- https://www.palantir.com/2011/10/how-to-rock-a-systems-design-interview/
-- http://blog.gainlo.co/index.php/2017/04/13/system-design-interviews-part-ii-complete-guide-google-interview-preparation/
+* https://github.com/donnemartin/system-design-primer
+* https://github.com/checkcheckzz/system-design-interview
+* https://github.com/shashank88/system_design
+* https://gist.github.com/vasanthk/485d1c25737e8e72759f
+* http://www.puncsky.com/blog/2016/02/14/crack-the-system-design-interview/
+* https://www.palantir.com/2011/10/how-to-rock-a-systems-design-interview/
+* http://blog.gainlo.co/index.php/2017/04/13/system-design-interviews-part-ii-complete-guide-google-interview-preparation/
## Flow
#### A. Understand the problem and scope
-- Define the use cases, with interviewer's help.
-- Suggest additional features.
-- Remove items that interviewer deems out of scope.
-- Assume high availability is required, add as a use case.
+* Define the use cases, with interviewer's help.
+* Suggest additional features.
+* Remove items that interviewer deems out of scope.
+* Assume high availability is required, add as a use case.
#### B. Think about constraints
-- Ask how many requests per month.
-- Ask how many requests per second (they may volunteer it or make you do the math).
-- Estimate reads vs. writes percentage.
-- Keep 80/20 rule in mind when estimating.
-- How much data written per second.
-- Total storage required over 5 years.
-- How much data reads per second.
+* Ask how many requests per month.
+* Ask how many requests per second (they may volunteer it or make you do the math).
+* Estimate reads vs. writes percentage.
+* Keep 80/20 rule in mind when estimating.
+* How much data written per second.
+* Total storage required over 5 years.
+* How much data reads per second.
#### C. Abstract design
-- Layers (service, data, caching).
-- Infrastructure: load balancing, messaging.
-- Rough overview of any key algorithm that drives the service.
-- Consider bottlenecks and determine solutions.
+* Layers (service, data, caching).
+* Infrastructure: load balancing, messaging.
+* Rough overview of any key algorithm that drives the service.
+* Consider bottlenecks and determine solutions.
Source: https://github.com/jwasham/coding-interview-university#system-design-scalability-data-handling
## Grading Rubrics
-- Problem Solving - How systematic is your approach to solving the problem step-by-step? Break down a problem into its core components.
-- Communication - How well do you explain your idea and communicate it with others?
-- Evaluation - How do you evaluate your system? Are you aware of the trade-offs made? How can you optimize it?
-- Estimation - How fast does your system need to be? How much space does it need? How much load will it experience?
+* Problem Solving - How systematic is your approach to solving the problem step-by-step? Break down a problem into its core components.
+* Communication - How well do you explain your idea and communicate it with others?
+* Evaluation - How do you evaluate your system? Are you aware of the trade-offs made? How can you optimize it?
+* Estimation - How fast does your system need to be? How much space does it need? How much load will it experience?
## Specific Topics
-- URL Shortener
- - http://stackoverflow.com/questions/742013/how-to-code-a-url-shortener
- - http://blog.gainlo.co/index.php/2016/03/08/system-design-interview-question-create-tinyurl-system/
- - https://www.interviewcake.com/question/python/url-shortener
-- Collaborative Editor
- - http://blog.gainlo.co/index.php/2016/03/22/system-design-interview-question-how-to-design-google-docs/
-- Photo Sharing App
- - http://blog.gainlo.co/index.php/2016/03/01/system-design-interview-question-create-a-photo-sharing-app/
-- Social Network Feed
- - http://blog.gainlo.co/index.php/2016/02/17/system-design-interview-question-how-to-design-twitter-part-1/
- - http://blog.gainlo.co/index.php/2016/02/24/system-design-interview-question-how-to-design-twitter-part-2/
- - http://blog.gainlo.co/index.php/2016/03/29/design-news-feed-system-part-1-system-design-interview-questions/
-- Trending Algorithm
- - http://blog.gainlo.co/index.php/2016/05/03/how-to-design-a-trending-algorithm-for-twitter/
-- Facebook Chat
- - http://blog.gainlo.co/index.php/2016/04/19/design-facebook-chat-function/
-- Key Value Store
- - http://blog.gainlo.co/index.php/2016/06/14/design-a-key-value-store-part-i/
- - http://blog.gainlo.co/index.php/2016/06/21/design-key-value-store-part-ii/
-- Recommendation System
- - http://blog.gainlo.co/index.php/2016/05/24/design-a-recommendation-system/
-- Cache System
- - http://blog.gainlo.co/index.php/2016/05/17/design-a-cache-system/
-- E-commerce Website
- - http://blog.gainlo.co/index.php/2016/08/22/design-ecommerce-website-part/
- - http://blog.gainlo.co/index.php/2016/08/28/design-ecommerce-website-part-ii/
-- Web Crawler
- - http://blog.gainlo.co/index.php/2016/06/29/build-web-crawler/
- - http://www.makeuseof.com/tag/how-do-search-engines-work-makeuseof-explains/
- - https://www.quora.com/How-can-I-build-a-web-crawler-from-scratch/answer/Chris-Heller
-- YouTube
- - http://blog.gainlo.co/index.php/2016/10/22/design-youtube-part/
- - http://blog.gainlo.co/index.php/2016/11/04/design-youtube-part-ii/
-- Hit Counter
- - http://blog.gainlo.co/index.php/2016/09/12/dropbox-interview-design-hit-counter/
-- Facebook Graph Search
-- Design [Lyft Line](https://www.lyft.com/line).
-- Design a promo code system (with same promo code, randomly generated promo code, and promo code with conditions).
-- Model a university.
-- How would you implement Pacman?
-- Sketch out an implementation of Asteroids.
-- Implement a spell checker.
-- Design the rubik cube.
-- Design a high-level interface to be used for card games (e.g. poker, blackjack etc).
+* URL Shortener
+ * http://stackoverflow.com/questions/742013/how-to-code-a-url-shortener
+ * http://blog.gainlo.co/index.php/2016/03/08/system-design-interview-question-create-tinyurl-system/
+ * https://www.interviewcake.com/question/python/url-shortener
+* Collaborative Editor
+ * http://blog.gainlo.co/index.php/2016/03/22/system-design-interview-question-how-to-design-google-docs/
+* Photo Sharing App
+ * http://blog.gainlo.co/index.php/2016/03/01/system-design-interview-question-create-a-photo-sharing-app/
+* Social Network Feed
+ * http://blog.gainlo.co/index.php/2016/02/17/system-design-interview-question-how-to-design-twitter-part-1/
+ * http://blog.gainlo.co/index.php/2016/02/24/system-design-interview-question-how-to-design-twitter-part-2/
+ * http://blog.gainlo.co/index.php/2016/03/29/design-news-feed-system-part-1-system-design-interview-questions/
+* Trending Algorithm
+ * http://blog.gainlo.co/index.php/2016/05/03/how-to-design-a-trending-algorithm-for-twitter/
+* Facebook Chat
+ * http://blog.gainlo.co/index.php/2016/04/19/design-facebook-chat-function/
+* Key Value Store
+ * http://blog.gainlo.co/index.php/2016/06/14/design-a-key-value-store-part-i/
+ * http://blog.gainlo.co/index.php/2016/06/21/design-key-value-store-part-ii/
+* Recommendation System
+ * http://blog.gainlo.co/index.php/2016/05/24/design-a-recommendation-system/
+* Cache System
+ * http://blog.gainlo.co/index.php/2016/05/17/design-a-cache-system/
+* E-commerce Website
+ * http://blog.gainlo.co/index.php/2016/08/22/design-ecommerce-website-part/
+ * http://blog.gainlo.co/index.php/2016/08/28/design-ecommerce-website-part-ii/
+* Web Crawler
+ * http://blog.gainlo.co/index.php/2016/06/29/build-web-crawler/
+ * http://www.makeuseof.com/tag/how-do-search-engines-work-makeuseof-explains/
+ * https://www.quora.com/How-can-I-build-a-web-crawler-from-scratch/answer/Chris-Heller
+* YouTube
+ * http://blog.gainlo.co/index.php/2016/10/22/design-youtube-part/
+ * http://blog.gainlo.co/index.php/2016/11/04/design-youtube-part-ii/
+* Hit Counter
+ * http://blog.gainlo.co/index.php/2016/09/12/dropbox-interview-design-hit-counter/
+* Facebook Graph Search
+* Design [Lyft Line](https://www.lyft.com/line).
+* Design a promo code system (with same promo code, randomly generated promo code, and promo code with conditions).
+* Model a university.
+* How would you implement Pacman?
+* Sketch out an implementation of Asteroids.
+* Implement a spell checker.
+* Design the rubik cube.
+* Design a high-level interface to be used for card games (e.g. poker, blackjack etc).
diff --git a/design/collaborative-editor.md b/design/collaborative-editor.md
index 2f9427c1..1f4edac7 100644
--- a/design/collaborative-editor.md
+++ b/design/collaborative-editor.md
@@ -1,81 +1,80 @@
-Collaborative Document Editor
-==
+# Collaborative Document Editor
## Variants
-- Design Google docs.
-- Design a collaborative code editor like Coderpad/Codepile.
-- Design a collaborative markdown editor.
+* Design Google docs.
+* Design a collaborative code editor like Coderpad/Codepile.
+* Design a collaborative markdown editor.
## Requirements Gathering
-- What is the intended platform?
- - Web
-- What features are required?
- - Creating a document
- - Editing a document
- - Sharing a document
-- Bonus features
- - Document revisions and reverting
- - Searching
- - Commenting
- - Chatting
- - Executing code (in the case of code editor)
-- What is in a document?
- - Text
- - Images
-- Which metrics should we optimize for?
- - Loading time
- - Synchronization
- - Throughput
+* What is the intended platform?
+ * Web
+* What features are required?
+ * Creating a document
+ * Editing a document
+ * Sharing a document
+* Bonus features
+ * Document revisions and reverting
+ * Searching
+ * Commenting
+ * Chatting
+ * Executing code (in the case of code editor)
+* What is in a document?
+ * Text
+ * Images
+* Which metrics should we optimize for?
+ * Loading time
+ * Synchronization
+ * Throughput
## Core Components
-- Front end
- - WebSockets/long polling for real-time communication between front end and back end.
-- Back end services behind a reverse proxy.
- - Reverse proxy will proxy the requests to the right server.
- - Split into a few services for different purposes.
- - The benefit of this is that each service can use different languages that best suits its purpose.
-- API servers for non-collaborative features and endpoints.
- - Ruby/Rails/Django for the server that deals with CRUD operations on data models where performance is not that crucial.
-- WebSocket servers for handling document edits and publishing updates to listeners.
- - Possibly Node/Golang for WebSocket server which will need high performance as updates are frequent.
-- Task queue to persist document updates to the database.
-- ELB in front of back end servers.
-- MySQL database.
-- S3 and CDN for images.
+* Front end
+ * WebSockets/long polling for real-time communication between front end and back end.
+* Back end services behind a reverse proxy.
+ * Reverse proxy will proxy the requests to the right server.
+ * Split into a few services for different purposes.
+ * The benefit of this is that each service can use different languages that best suits its purpose.
+* API servers for non-collaborative features and endpoints.
+ * Ruby/Rails/Django for the server that deals with CRUD operations on data models where performance is not that crucial.
+* WebSocket servers for handling document edits and publishing updates to listeners.
+ * Possibly Node/Golang for WebSocket server which will need high performance as updates are frequent.
+* Task queue to persist document updates to the database.
+* ELB in front of back end servers.
+* MySQL database.
+* S3 and CDN for images.
## Data Modeling
-- What kind of database to use?
- - Data is quite structured. Would go with SQL.
-- Design the necessary tables, its columns and its relations.
- - `users`
- - `id`
- - `name`
- - `document`
- - `id`
- - `owner_id`
- - `permissions`
- - `id`
- - `name`
- - `document_permissions`
- - `id`
- - `document_id`
- - `user_id`
+* What kind of database to use?
+ * Data is quite structured. Would go with SQL.
+* Design the necessary tables, its columns and its relations.
+ * `users`
+ * `id`
+ * `name`
+ * `document`
+ * `id`
+ * `owner_id`
+ * `permissions`
+ * `id`
+ * `name`
+ * `document_permissions`
+ * `id`
+ * `document_id`
+ * `user_id`
## Collaborative Editing - Client
-- Upon loading of the page and document, the client should connect to the WebSocket server over the WebSocket protocol `ws://`.
-- Upon connection, perform a time sync with the server, possibly via Network Time Protocol (NTP).
-- The most straightforward way is to send the whole updated document content to the back end, and all users currently viewing the document will receive the updated document. However, there are a few problems with this approach:
- - Race condition. If two users editing the document at the same time, the last one to edit will overwrite the changes by the previous user. One workaround is to lock the document when a user is currently editing it, but that will not make it real-time collaborative.
- - A large payload (the whole document) is being sent to servers and published to users on each change, and the user is likely to already have most of the content. A lot of redundant data being sent.
-- A feasible approach would be to use operational transforms and send just the action deltas to the back end. The back end publishes the action deltas to the listeners. What is considered an action delta?
- - (a) Changing a character/word, (b) inserting a character/word/image, (c) deleting a character/word.
- - With this approach, the payload will contain only small amount of data, such as (a) type of change, (b) character/word, (c) position in document: line/column, (d) timestamp. Why is the timestamp needed? Read on to find out.
-- Updates can also be throttled and batched, to avoid flooding the web server with requests. For example, if a user inserts a
+* Upon loading of the page and document, the client should connect to the WebSocket server over the WebSocket protocol `ws://`.
+* Upon connection, perform a time sync with the server, possibly via Network Time Protocol (NTP).
+* The most straightforward way is to send the whole updated document content to the back end, and all users currently viewing the document will receive the updated document. However, there are a few problems with this approach:
+ * Race condition. If two users editing the document at the same time, the last one to edit will overwrite the changes by the previous user. One workaround is to lock the document when a user is currently editing it, but that will not make it real-time collaborative.
+ * A large payload (the whole document) is being sent to servers and published to users on each change, and the user is likely to already have most of the content. A lot of redundant data being sent.
+* A feasible approach would be to use operational transforms and send just the action deltas to the back end. The back end publishes the action deltas to the listeners. What is considered an action delta?
+ * (a) Changing a character/word, (b) inserting a character/word/image, (c) deleting a character/word.
+ * With this approach, the payload will contain only small amount of data, such as (a) type of change, (b) character/word, (c) position in document: line/column, (d) timestamp. Why is the timestamp needed? Read on to find out.
+* Updates can also be throttled and batched, to avoid flooding the web server with requests. For example, if a user inserts a
## Back End
@@ -83,21 +82,21 @@ The back end is split into a few portions: WebSocket server for receiving and br
## WebSocket Server
-- Languages and frameworks that support async requests and non-blocking I/O will be suitable for the collaborative editor server. Node and Golang comes to my mind.
-- However, the WebSocket server is not stateless, so is it not that straightforward to scale horizontally. One approach would be for a Load Balancer to use Redis to maintain a map of the client to the WebSocket server instance IP, such that subsequent requests from the same client will be routed to the same server.
-- Each document corresponds to a room (more of namespace). Users can subscribe to the events happening within a room.
-- When a action delta is being received, blast it out to the listeners within the room and add it to the task queue.
+* Languages and frameworks that support async requests and non-blocking I/O will be suitable for the collaborative editor server. Node and Golang comes to my mind.
+* However, the WebSocket server is not stateless, so is it not that straightforward to scale horizontally. One approach would be for a Load Balancer to use Redis to maintain a map of the client to the WebSocket server instance IP, such that subsequent requests from the same client will be routed to the same server.
+* Each document corresponds to a room (more of namespace). Users can subscribe to the events happening within a room.
+* When a action delta is being received, blast it out to the listeners within the room and add it to the task queue.
## CRUD Server
-- Provides APIs for reading and writing non-document-related data, such as users, permissions.
+* Provides APIs for reading and writing non-document-related data, such as users, permissions.
## Task Queue + Worker Service
-- Worker service retrieves messages from the task queue and writes the updated documents to the database in an async fashion.
-- Batch the actions together and perform one larger write that consists of multiple actions. For example, instead of persisting to the database once per addition of a word, combine these additions and write them into the database at once.
-- Publish the save completion event to the WebSocket server to be published to the listeners, informing that the latest version of the document is being saved.
-- Benefit of using a task queue is that as the amount of tasks in the queue goes up, we can scale up the number of worker services to clear the backlog of work faster.
+* Worker service retrieves messages from the task queue and writes the updated documents to the database in an async fashion.
+* Batch the actions together and perform one larger write that consists of multiple actions. For example, instead of persisting to the database once per addition of a word, combine these additions and write them into the database at once.
+* Publish the save completion event to the WebSocket server to be published to the listeners, informing that the latest version of the document is being saved.
+* Benefit of using a task queue is that as the amount of tasks in the queue goes up, we can scale up the number of worker services to clear the backlog of work faster.
## Document Persistence
@@ -105,4 +104,4 @@ TODO
###### References
-- http://blog.gainlo.co/index.php/2016/03/22/system-design-interview-question-how-to-design-google-docs/
+* http://blog.gainlo.co/index.php/2016/03/22/system-design-interview-question-how-to-design-google-docs/
diff --git a/design/news-feed.md b/design/news-feed.md
index 8dccbfd2..4dd6ce0f 100644
--- a/design/news-feed.md
+++ b/design/news-feed.md
@@ -1,46 +1,45 @@
-News Feed
-==
+# News Feed
## Variants
-- Design Facebook news feed.
-- Design Twitter news feed.
-- Design Quora feed.
-- Design Instagram feed.
+* Design Facebook news feed.
+* Design Twitter news feed.
+* Design Quora feed.
+* Design Instagram feed.
## Requirements Gathering
-- What is the intended platform?
- - Mobile (mobile web or native)? Web? Desktop?
-- What features are required?
- - CRUD posts.
- - Commenting on posts.
- - Sharing posts.
- - Trending posts?
- - Tag people?
- - Hashtags?
-- What is in a news feed post?
- - Author.
- - Content.
- - Media.
- - Tags?
- - Hashtags?
- - Comments/Replies.
- - Operations:
- - CRUD
- - Commenting/replying to a post.
-- What is in a news feed?
- - Sequence of posts.
- - Query pattern: query for a user's ranked news feed.
- - Operations:
- - Append - Fetch more posts.
- - Delete - I don't want to see this.
-- Which metrics should we optimize for?
- - User retention.
- - Ads revenue.
- - Fast loading time.
- - Bandwidth.
- - Server costs.
+* What is the intended platform?
+ * Mobile (mobile web or native)? Web? Desktop?
+* What features are required?
+ * CRUD posts.
+ * Commenting on posts.
+ * Sharing posts.
+ * Trending posts?
+ * Tag people?
+ * Hashtags?
+* What is in a news feed post?
+ * Author.
+ * Content.
+ * Media.
+ * Tags?
+ * Hashtags?
+ * Comments/Replies.
+ * Operations:
+ * CRUD
+ * Commenting/replying to a post.
+* What is in a news feed?
+ * Sequence of posts.
+ * Query pattern: query for a user's ranked news feed.
+ * Operations:
+ * Append - Fetch more posts.
+ * Delete - I don't want to see this.
+* Which metrics should we optimize for?
+ * User retention.
+ * Ads revenue.
+ * Fast loading time.
+ * Bandwidth.
+ * Server costs.
## Core Components
@@ -48,14 +47,14 @@ TODO
## Data modeling
-- What kind of database to use?
- - Data is quite structured. Would go with SQL.
-- Design the necessary tables, its columns and its relations.
- - `users`
- - `posts`
- - `likes`
- - `follows`
- - `comments`
+* What kind of database to use?
+ * Data is quite structured. Would go with SQL.
+* Design the necessary tables, its columns and its relations.
+ * `users`
+ * `posts`
+ * `likes`
+ * `follows`
+ * `comments`
> There are two basic objects: user and feed. For user object, we can store userID, name, registration date and so on so forth. And for feed object, there are feedId, feedType, content, metadata etc., which should support images and videos as well.
>
@@ -68,48 +67,49 @@ TODO
> A common optimization is to store feed content together with feedID in user-feed table so that we don't need to join the feed table any more. This approach is called denormalization, which means by adding redundant data, we can optimize the read performance (reducing the number of joins).
>
> The disadvantages are obvious:
-> - Data redundancy. We are storing redundant data, which occupies storage space (classic time-space trade-off).
-> - Data consistency. Whenever we update a feed, we need to update both feed table and user-feed table. Otherwise, there is data inconsistency. This increases the complexity of the system.
-> - Remember that there's no one approach always better than the other (normalization vs denormalization). It's a matter of whether you want to optimize for read or write.
+>
+> * Data redundancy. We are storing redundant data, which occupies storage space (classic time-space trade-off).
+> * Data consistency. Whenever we update a feed, we need to update both feed table and user-feed table. Otherwise, there is data inconsistency. This increases the complexity of the system.
+> * Remember that there's no one approach always better than the other (normalization vs denormalization). It's a matter of whether you want to optimize for read or write.
## Feed Display
-- The most straightforward way is to fetch posts from all the people you follow and render them sorted by time.
-- There can be many posts to fetch. How many posts should you fetch?
- - What are the pagination approaches and the pros and cons of each approach?
- - Offset by page size
- - Offset by time
-- What data should the post contain when you initially fetch them?
-- Lazy loading approach for loading associated data: media, comments, people who liked the post.
-- Media
- - If the post contains media such as images and videos, how should they be handled? Should they be loaded on the spot?
- - A better way would be to fetch images only when they are about to enter the viewport.
- - Videos should not autoplay. Only fetch the thumbnail for the video, and only play the video when user clicks play.
- - If the content is being refetched, the media should be cached and not fetched over the wire again. This is especially important on mobile connections where data can be expensive.
-- Comments
- - Should you fetch all the comments for a post? For posts by celebrities, they can contain a few hundred or thousand comments.
- - Maybe fetch the top few comments and display them under the post, and the user is given the choice to "show all comments".
-- How does the user request for new content?
- - Infinite scrolling.
- - User has to tap next page.
+* The most straightforward way is to fetch posts from all the people you follow and render them sorted by time.
+* There can be many posts to fetch. How many posts should you fetch?
+* What are the pagination approaches and the pros and cons of each approach?
+* Offset by page size
+* Offset by time
+* What data should the post contain when you initially fetch them?
+* Lazy loading approach for loading associated data: media, comments, people who liked the post.
+* Media
+ * If the post contains media such as images and videos, how should they be handled? Should they be loaded on the spot?
+ * A better way would be to fetch images only when they are about to enter the viewport.
+ * Videos should not autoplay. Only fetch the thumbnail for the video, and only play the video when user clicks play.
+ * If the content is being refetched, the media should be cached and not fetched over the wire again. This is especially important on mobile connections where data can be expensive.
+* Comments
+ * Should you fetch all the comments for a post? For posts by celebrities, they can contain a few hundred or thousand comments.
+ * Maybe fetch the top few comments and display them under the post, and the user is given the choice to "show all comments".
+* How does the user request for new content?
+ * Infinite scrolling.
+ * User has to tap next page.
## Feed Ranking
-- First select features/signals that are relevant and then figure out how to combine them to calculate a final score.
-- How do you show the relevant posts that the user is interested in?
- - Chronological - While a chronological approach works, it may not be the most engaging approach. For example, if a person posts 30 times within the last hour, his followers will have their news feed clogged up with his posts. Maybe set a cap on the number of time a person's posts can appear within the feed.
- - Popularity - How many likes and comments does the post have? Does the user usually like posts by that person?
-- How do you determine which are the more important posts? A user might be more interested in a few-hour old post from a good friend than a very recent post from an acquaintance.
-- A common strategy is to calculate a post score based on various features and rank posts by its score.
-- Prior to 2013, Facebook was using the [EdgeRank](https://www.wikiwand.com/en/EdgeRank) algorithm to determine what articles should be displayed in a user's News Feed.
-- Edge Rank basically is using three signals: affinity score, edge weight and time decay.
- - Affinity score (u) - For each news feed, affinity score evaluates how close you are with this user. For instance, you are more likely to care about feed from your close friends instead of someone you just met once.
- - Edge weight (e) - Edge weight basically reflects importance of each edge. For instance, comments are worth more than likes.
- - Time decay (d) - The older the story, the less likely users find it interesting.
-- Affinity score
- - Various factors can be used to reflect how close two people are. First of all, explicit interactions like comment, like, tag, share, click etc. are strong signals we should use. Apparently, each type of interaction should have different weight. For instance, comments should be worth much more than likes.
- - Secondly, we should also track the time factor. Perhaps you used to interact with a friend quite a lot, but less frequent recently. In this case, we should lower the affinity score. So for each interaction, we should also put the time decay factor.
-- A good ranking system can improve some core metrics - user retention, ads revenue, etc.
+* First select features/signals that are relevant and then figure out how to combine them to calculate a final score.
+* How do you show the relevant posts that the user is interested in?
+ * Chronological - While a chronological approach works, it may not be the most engaging approach. For example, if a person posts 30 times within the last hour, his followers will have their news feed clogged up with his posts. Maybe set a cap on the number of time a person's posts can appear within the feed.
+ * Popularity - How many likes and comments does the post have? Does the user usually like posts by that person?
+* How do you determine which are the more important posts? A user might be more interested in a few-hour old post from a good friend than a very recent post from an acquaintance.
+* A common strategy is to calculate a post score based on various features and rank posts by its score.
+* Prior to 2013, Facebook was using the [EdgeRank](https://www.wikiwand.com/en/EdgeRank) algorithm to determine what articles should be displayed in a user's News Feed.
+* Edge Rank basically is using three signals: affinity score, edge weight and time decay.
+ * Affinity score (u) - For each news feed, affinity score evaluates how close you are with this user. For instance, you are more likely to care about feed from your close friends instead of someone you just met once.
+ * Edge weight (e) - Edge weight basically reflects importance of each edge. For instance, comments are worth more than likes.
+ * Time decay (d) - The older the story, the less likely users find it interesting.
+* Affinity score
+ * Various factors can be used to reflect how close two people are. First of all, explicit interactions like comment, like, tag, share, click etc. are strong signals we should use. Apparently, each type of interaction should have different weight. For instance, comments should be worth much more than likes.
+ * Secondly, we should also track the time factor. Perhaps you used to interact with a friend quite a lot, but less frequent recently. In this case, we should lower the affinity score. So for each interaction, we should also put the time decay factor.
+* A good ranking system can improve some core metrics - user retention, ads revenue, etc.
## Feed Publishing
@@ -119,46 +119,46 @@ TODO. Refer to http://blog.gainlo.co/index.php/2016/04/05/design-news-feed-syste
#### Tagging feature
-- Have a `tags` table that stores the relation between a post and the people tagged in it.
+* Have a `tags` table that stores the relation between a post and the people tagged in it.
#### Sharing feature
-- Add a column to `posts` table called `original_post_id`.
-- What should happen when the original post is deleted?
- - The shared `posts` have to be deleted too.
+* Add a column to `posts` table called `original_post_id`.
+* What should happen when the original post is deleted?
+ * The shared `posts` have to be deleted too.
#### Notifications feature
-- When should notifications happen?
-- Can the user subscribe to only certain types of notifications?
+* When should notifications happen?
+* Can the user subscribe to only certain types of notifications?
#### Trending feature
-- What constitutes trending? What signals would you look at? What weight would you give to each signal?
-- Most frequent hashtags over the last N hours.
-- Hottest search queries.
-- Fetch the recent most popular feeds and extract some common words or phrases.
+* What constitutes trending? What signals would you look at? What weight would you give to each signal?
+* Most frequent hashtags over the last N hours.
+* Hottest search queries.
+* Fetch the recent most popular feeds and extract some common words or phrases.
#### Search feature
-- How would you index the data?
+* How would you index the data?
## Scalability
-- Master-slave replication.
- - Write to master database and read from replica databases/in-memory data store.
- - Post contents are being read more than they are updated. It is acceptable to have a slight lag between a user updating a post and followers seeing the updated content. Tweets are not even editable.
-- Data for real-time queries should be in memory, disk is for writes only.
-- Pre-computation offline.
-- Tracking number of likes and comments.
- - Expensive to do a `COUNT` on the `likes` and `comments` for a post.
- - Use Redis/Memcached for keeping track of how many likes/comments a post has. Increment when there's new activity, decrement when someone unlikes/deletes the comment.
-- Load balancer in front of your API servers.
-- Partitioning the data.
+* Master-slave replication.
+ * Write to master database and read from replica databases/in-memory data store.
+ * Post contents are being read more than they are updated. It is acceptable to have a slight lag between a user updating a post and followers seeing the updated content. Tweets are not even editable.
+* Data for real-time queries should be in memory, disk is for writes only.
+* Pre-computation offline.
+* Tracking number of likes and comments.
+ * Expensive to do a `COUNT` on the `likes` and `comments` for a post.
+ * Use Redis/Memcached for keeping track of how many likes/comments a post has. Increment when there's new activity, decrement when someone unlikes/deletes the comment.
+* Load balancer in front of your API servers.
+* Partitioning the data.
###### References
-- [Design News Feed System (Part 1)](http://blog.gainlo.co/index.php/2016/03/29/design-news-feed-system-part-1-system-design-interview-questions/)
-- [Design News Feed System (Part 1)](http://blog.gainlo.co/index.php/2016/04/05/design-news-feed-system-part-2/)
-- [Etsy Activity Feeds Architecture](https://www.slideshare.net/danmckinley/etsy-activity-feeds-architecture)
-- [Big Data in Real-Time at Twitter](https://www.slideshare.net/nkallen/q-con-3770885)
+* [Design News Feed System (Part 1)](http://blog.gainlo.co/index.php/2016/03/29/design-news-feed-system-part-1-system-design-interview-questions/)
+* [Design News Feed System (Part 1)](http://blog.gainlo.co/index.php/2016/04/05/design-news-feed-system-part-2/)
+* [Etsy Activity Feeds Architecture](https://www.slideshare.net/danmckinley/etsy-activity-feeds-architecture)
+* [Big Data in Real-Time at Twitter](https://www.slideshare.net/nkallen/q-con-3770885)
diff --git a/design/search-engine.md b/design/search-engine.md
index 4703313b..91c28889 100644
--- a/design/search-engine.md
+++ b/design/search-engine.md
@@ -1,6 +1,5 @@
-Search Engine
-==
+# Search Engine
###### References
-- [How Do Search Engines Work?](http://www.makeuseof.com/tag/how-do-search-engines-work-makeuseof-explains/)
+* [How Do Search Engines Work?](http://www.makeuseof.com/tag/how-do-search-engines-work-makeuseof-explains/)
diff --git a/domain/databases.md b/domain/databases.md
index 80b17257..74711c8d 100644
--- a/domain/databases.md
+++ b/domain/databases.md
@@ -1,8 +1,7 @@
-Databases
-==
+# Databases
## General
-- How should you store passwords in a database?
- - http://www.geeksforgeeks.org/store-password-database/
- - https://nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/
+* How should you store passwords in a database?
+ * http://www.geeksforgeeks.org/store-password-database/
+ * https://nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/
diff --git a/domain/networking.md b/domain/networking.md
index cc56fc9d..78257527 100644
--- a/domain/networking.md
+++ b/domain/networking.md
@@ -1,6 +1,5 @@
-Networking
-==
+# Networking
-- Given an IPv4 IP address p and an integer n, return a list of CIDR strings that most succinctly represents the range of IP addresses from p to (p + n).
-- Describe what happens when you enter a url in the web browser.
-- Define UDP/TCP and give an example of both.
+* Given an IPv4 IP address p and an integer n, return a list of CIDR strings that most succinctly represents the range of IP addresses from p to (p + n).
+* Describe what happens when you enter a url in the web browser.
+* Define UDP/TCP and give an example of both.
diff --git a/domain/pagination-sorting/data.js b/domain/pagination-sorting/data.js
index 6001ce83..0d0832f6 100644
--- a/domain/pagination-sorting/data.js
+++ b/domain/pagination-sorting/data.js
@@ -1,677 +1,677 @@
const data = [
{
- "_id": "591ad7e2d1b6119887420af5",
- "age": 36,
- "name": "Salas Mccarthy",
- "gender": "male",
- "company": "MAKINGWAY",
- "email": "salasmccarthy@makingway.com",
- "phone": "+1 (905) 546-3931"
- },
- {
- "_id": "591ad7e2918b0ba1231b582d",
- "age": 29,
- "name": "Jodi Graham",
- "gender": "female",
- "company": "BITREX",
- "email": "jodigraham@bitrex.com",
- "phone": "+1 (861) 596-2691"
- },
- {
- "_id": "591ad7e2bc19d181dcb64d57",
- "age": 34,
- "name": "Hollie Hardin",
- "gender": "female",
- "company": "ZENSURE",
- "email": "holliehardin@zensure.com",
- "phone": "+1 (822) 410-2433"
- },
- {
- "_id": "591ad7e224d2fa7216132561",
- "age": 26,
- "name": "Bullock Cole",
- "gender": "male",
- "company": "ZILPHUR",
- "email": "bullockcole@zilphur.com",
- "phone": "+1 (839) 563-3350"
- },
- {
- "_id": "591ad7e206c3fb3043ccf8a8",
- "age": 30,
- "name": "Peterson Mosley",
- "gender": "male",
- "company": "MOBILDATA",
- "email": "petersonmosley@mobildata.com",
- "phone": "+1 (974) 547-3461"
- },
- {
- "_id": "591ad7e20a180de908b0960e",
- "age": 34,
- "name": "Lucille Jackson",
- "gender": "female",
- "company": "KINETICUT",
- "email": "lucillejackson@kineticut.com",
- "phone": "+1 (845) 443-3594"
- },
- {
- "_id": "591ad7e2768b0cf4837ecf35",
- "age": 40,
- "name": "Cooper Leonard",
- "gender": "male",
- "company": "CHORIZON",
- "email": "cooperleonard@chorizon.com",
- "phone": "+1 (817) 418-2290"
- },
- {
- "_id": "591ad7e270a640cf8f8a3e44",
- "age": 27,
- "name": "Iris Shepherd",
- "gender": "female",
- "company": "IDEALIS",
- "email": "irisshepherd@idealis.com",
- "phone": "+1 (858) 599-3628"
- },
- {
- "_id": "591ad7e222ddd244aaba0315",
- "age": 31,
- "name": "Oneil Head",
- "gender": "male",
- "company": "LIMOZEN",
- "email": "oneilhead@limozen.com",
- "phone": "+1 (894) 440-3396"
- },
- {
- "_id": "591ad7e2d36847b5e648587b",
- "age": 28,
- "name": "Swanson Singleton",
- "gender": "male",
- "company": "NSPIRE",
- "email": "swansonsingleton@nspire.com",
- "phone": "+1 (817) 510-2480"
- },
- {
- "_id": "591ad7e2b78092f9fb866779",
- "age": 37,
- "name": "Sutton Odom",
- "gender": "male",
- "company": "GLUKGLUK",
- "email": "suttonodom@glukgluk.com",
- "phone": "+1 (961) 424-2812"
- },
- {
- "_id": "591ad7e222736aa66a9b35cc",
- "age": 31,
- "name": "Chandler Kirk",
- "gender": "male",
- "company": "EWAVES",
- "email": "chandlerkirk@ewaves.com",
- "phone": "+1 (902) 524-3712"
- },
- {
- "_id": "591ad7e2ac3f9abecd5175a7",
- "age": 28,
- "name": "Gentry Stanley",
- "gender": "male",
- "company": "GINK",
- "email": "gentrystanley@gink.com",
- "phone": "+1 (878) 592-2331"
- },
- {
- "_id": "591ad7e2f79787dc605d61fb",
- "age": 28,
- "name": "Paulette Guthrie",
- "gender": "female",
- "company": "SEQUITUR",
- "email": "pauletteguthrie@sequitur.com",
- "phone": "+1 (820) 473-2926"
- },
- {
- "_id": "591ad7e2ff61553783737bc0",
- "age": 37,
- "name": "Lesley Nash",
- "gender": "female",
- "company": "MELBACOR",
- "email": "lesleynash@melbacor.com",
- "phone": "+1 (849) 414-2115"
- },
- {
- "_id": "591ad7e26f9c3fc95fa8e6f1",
- "age": 22,
- "name": "Frye Oneil",
- "gender": "male",
- "company": "OVERPLEX",
- "email": "fryeoneil@overplex.com",
- "phone": "+1 (999) 412-2403"
- },
- {
- "_id": "591ad7e2eee8b7cd857a29d0",
- "age": 40,
- "name": "Christina Zamora",
- "gender": "female",
- "company": "REPETWIRE",
- "email": "christinazamora@repetwire.com",
- "phone": "+1 (860) 504-3885"
- },
- {
- "_id": "591ad7e2be93544c81761053",
- "age": 25,
- "name": "Earlene Dunn",
- "gender": "female",
- "company": "PHARMEX",
- "email": "earlenedunn@pharmex.com",
- "phone": "+1 (831) 582-2974"
- },
- {
- "_id": "591ad7e2cb672de927940ef4",
- "age": 25,
- "name": "Hoffman Pittman",
- "gender": "male",
- "company": "ENOMEN",
- "email": "hoffmanpittman@enomen.com",
- "phone": "+1 (882) 420-3186"
- },
- {
- "_id": "591ad7e2aabaae50d75c21a3",
- "age": 35,
- "name": "Wilson Tran",
- "gender": "male",
- "company": "CAXT",
- "email": "wilsontran@caxt.com",
- "phone": "+1 (842) 529-3085"
- },
- {
- "_id": "591ad7e2bdd6104be85bdd87",
- "age": 22,
- "name": "Hensley Hawkins",
- "gender": "male",
- "company": "LUDAK",
- "email": "hensleyhawkins@ludak.com",
- "phone": "+1 (902) 566-3308"
- },
- {
- "_id": "591ad7e24796cbdc0eacb6c0",
- "age": 36,
- "name": "Gray Schultz",
- "gender": "male",
- "company": "EBIDCO",
- "email": "grayschultz@ebidco.com",
- "phone": "+1 (910) 532-2845"
- },
- {
- "_id": "591ad7e204425cc3b121279a",
- "age": 25,
- "name": "Odonnell Livingston",
- "gender": "male",
- "company": "ANOCHA",
- "email": "odonnelllivingston@anocha.com",
- "phone": "+1 (991) 422-2754"
- },
- {
- "_id": "591ad7e2997ac59b446d3a30",
- "age": 36,
- "name": "Shelton Lindsay",
- "gender": "male",
- "company": "DENTREX",
- "email": "sheltonlindsay@dentrex.com",
- "phone": "+1 (899) 567-2928"
- },
- {
- "_id": "591ad7e2646dad2ff456b035",
- "age": 40,
- "name": "Mcclain Larson",
- "gender": "male",
- "company": "GENMOM",
- "email": "mcclainlarson@genmom.com",
- "phone": "+1 (934) 508-3477"
- },
- {
- "_id": "591ad7e21e908e847ee6d3ea",
- "age": 27,
- "name": "Miranda Branch",
- "gender": "female",
- "company": "ROCKYARD",
- "email": "mirandabranch@rockyard.com",
- "phone": "+1 (989) 446-2387"
- },
- {
- "_id": "591ad7e2d7905d2fcaa1ce18",
- "age": 36,
- "name": "Valencia Moreno",
- "gender": "male",
- "company": "KIOSK",
- "email": "valenciamoreno@kiosk.com",
- "phone": "+1 (807) 449-2626"
- },
- {
- "_id": "591ad7e245e3c4ce18a92054",
- "age": 40,
- "name": "Witt Leblanc",
- "gender": "male",
- "company": "ENERSAVE",
- "email": "wittleblanc@enersave.com",
- "phone": "+1 (809) 491-3886"
- },
- {
- "_id": "591ad7e27f2c70583d1cf34f",
- "age": 32,
- "name": "Glover Mccoy",
- "gender": "male",
- "company": "BYTREX",
- "email": "glovermccoy@bytrex.com",
- "phone": "+1 (928) 470-2426"
- },
- {
- "_id": "591ad7e22768012595c933c9",
- "age": 25,
- "name": "Billie Dunlap",
- "gender": "female",
- "company": "INQUALA",
- "email": "billiedunlap@inquala.com",
- "phone": "+1 (903) 415-2136"
- },
- {
- "_id": "591ad7e22df8d07559a29904",
- "age": 21,
- "name": "Bridget Hill",
- "gender": "female",
- "company": "TRIBALOG",
- "email": "bridgethill@tribalog.com",
- "phone": "+1 (954) 461-3390"
- },
- {
- "_id": "591ad7e201b2bddbc81ae05e",
- "age": 30,
- "name": "Dawson Clements",
- "gender": "male",
- "company": "EURON",
- "email": "dawsonclements@euron.com",
- "phone": "+1 (926) 570-3444"
- },
- {
- "_id": "591ad7e2c2aeb820e77c1d9a",
- "age": 31,
- "name": "Valdez Johnson",
- "gender": "male",
- "company": "RETRACK",
- "email": "valdezjohnson@retrack.com",
- "phone": "+1 (841) 506-2428"
- },
- {
- "_id": "591ad7e2370ff047048bd688",
- "age": 31,
- "name": "Nichole Dickerson",
- "gender": "female",
- "company": "NEOCENT",
- "email": "nicholedickerson@neocent.com",
- "phone": "+1 (945) 437-3591"
- },
- {
- "_id": "591ad7e2b77affba5a8f8603",
- "age": 34,
- "name": "Madden Weaver",
- "gender": "male",
- "company": "VERBUS",
- "email": "maddenweaver@verbus.com",
- "phone": "+1 (810) 598-3145"
- },
- {
- "_id": "591ad7e21e692cc8247b1d83",
- "age": 26,
- "name": "Larsen Benson",
- "gender": "male",
- "company": "ISOSURE",
- "email": "larsenbenson@isosure.com",
- "phone": "+1 (890) 435-2219"
- },
- {
- "_id": "591ad7e2de06284f2d2a8d19",
- "age": 37,
- "name": "Barnes Gaines",
- "gender": "male",
- "company": "RODEOCEAN",
- "email": "barnesgaines@rodeocean.com",
- "phone": "+1 (824) 484-2693"
- },
- {
- "_id": "591ad7e20d9d8224dfbd292f",
- "age": 28,
- "name": "Pacheco Landry",
- "gender": "male",
- "company": "METROZ",
- "email": "pachecolandry@metroz.com",
- "phone": "+1 (813) 525-3821"
- },
- {
- "_id": "591ad7e2c5348da6a981a148",
- "age": 21,
- "name": "Richard Alexander",
- "gender": "male",
- "company": "GADTRON",
- "email": "richardalexander@gadtron.com",
- "phone": "+1 (911) 513-3007"
- },
- {
- "_id": "591ad7e2ca9ef31ba3b67d4f",
- "age": 22,
- "name": "Stone Campos",
- "gender": "male",
- "company": "TETAK",
- "email": "stonecampos@tetak.com",
- "phone": "+1 (879) 440-3672"
- },
- {
- "_id": "591ad7e2ff5a9796c8470151",
- "age": 31,
- "name": "Walter Randall",
- "gender": "male",
- "company": "EQUITAX",
- "email": "walterrandall@equitax.com",
- "phone": "+1 (927) 563-3777"
- },
- {
- "_id": "591ad7e272c6b6c1241b3a4a",
- "age": 27,
- "name": "Copeland Compton",
- "gender": "male",
- "company": "MAXIMIND",
- "email": "copelandcompton@maximind.com",
- "phone": "+1 (829) 599-2574"
- },
- {
- "_id": "591ad7e2220c6caa9e2c444d",
- "age": 30,
- "name": "Lorie Irwin",
- "gender": "female",
- "company": "ELPRO",
- "email": "lorieirwin@elpro.com",
- "phone": "+1 (938) 584-2368"
- },
- {
- "_id": "591ad7e2942d603032f1ebda",
- "age": 35,
- "name": "Buck Roth",
- "gender": "male",
- "company": "COMTRACT",
- "email": "buckroth@comtract.com",
- "phone": "+1 (830) 585-3168"
- },
- {
- "_id": "591ad7e2c23efccd2fcd5b2e",
- "age": 31,
- "name": "Mamie Robinson",
- "gender": "female",
- "company": "ZOMBOID",
- "email": "mamierobinson@zomboid.com",
- "phone": "+1 (845) 481-3222"
- },
- {
- "_id": "591ad7e285109fadbf0f9c01",
- "age": 33,
- "name": "Bryan Stone",
- "gender": "male",
- "company": "PODUNK",
- "email": "bryanstone@podunk.com",
- "phone": "+1 (971) 469-3832"
- },
- {
- "_id": "591ad7e25abc328c2cc42283",
- "age": 37,
- "name": "Benson Lyons",
- "gender": "male",
- "company": "FUTURITY",
- "email": "bensonlyons@futurity.com",
- "phone": "+1 (964) 536-3522"
- },
- {
- "_id": "591ad7e28fa81611cdf5066a",
- "age": 37,
- "name": "Sally Finley",
- "gender": "female",
- "company": "ZYTRAC",
- "email": "sallyfinley@zytrac.com",
- "phone": "+1 (953) 506-2428"
- },
- {
- "_id": "591ad7e271c5882aa5452601",
- "age": 26,
- "name": "Callahan Mckee",
- "gender": "male",
- "company": "ACCUPRINT",
- "email": "callahanmckee@accuprint.com",
- "phone": "+1 (842) 400-3570"
- },
- {
- "_id": "591ad7e2275e787c5d9eea26",
- "age": 25,
- "name": "Ines Hamilton",
- "gender": "female",
- "company": "PROSURE",
- "email": "ineshamilton@prosure.com",
- "phone": "+1 (976) 485-2663"
- },
- {
- "_id": "591ad7e2d8790e386b671ec6",
- "age": 38,
- "name": "Mcknight Abbott",
- "gender": "male",
- "company": "MAXEMIA",
- "email": "mcknightabbott@maxemia.com",
- "phone": "+1 (960) 600-3920"
- },
- {
- "_id": "591ad7e2a1cae1e4f17d8db2",
- "age": 28,
- "name": "Tanisha Ross",
- "gender": "female",
- "company": "SYNKGEN",
- "email": "tanishaross@synkgen.com",
- "phone": "+1 (920) 502-3204"
- },
- {
- "_id": "591ad7e2f816fd6848bc03a3",
- "age": 22,
- "name": "Pam Webb",
- "gender": "female",
- "company": "VALREDA",
- "email": "pamwebb@valreda.com",
- "phone": "+1 (926) 442-2683"
- },
- {
- "_id": "591ad7e208585adb332ac653",
- "age": 29,
- "name": "Bobbi Mays",
- "gender": "female",
- "company": "PARLEYNET",
- "email": "bobbimays@parleynet.com",
- "phone": "+1 (940) 577-3487"
- },
- {
- "_id": "591ad7e2f4b29cbd1744b14e",
- "age": 27,
- "name": "Snider Sandoval",
- "gender": "male",
- "company": "GRONK",
- "email": "snidersandoval@gronk.com",
- "phone": "+1 (903) 526-2655"
- },
- {
- "_id": "591ad7e23a3f54209ec9deba",
- "age": 33,
- "name": "Fitzpatrick Weiss",
- "gender": "male",
- "company": "MICROLUXE",
- "email": "fitzpatrickweiss@microluxe.com",
- "phone": "+1 (894) 494-2135"
- },
- {
- "_id": "591ad7e229d21e1b7723c044",
- "age": 27,
- "name": "Kimberly Brown",
- "gender": "female",
- "company": "SPACEWAX",
- "email": "kimberlybrown@spacewax.com",
- "phone": "+1 (832) 481-2926"
- },
- {
- "_id": "591ad7e247e285f0c563ac94",
- "age": 20,
- "name": "Fisher Kent",
- "gender": "male",
- "company": "ORBIN",
- "email": "fisherkent@orbin.com",
- "phone": "+1 (962) 523-3956"
- },
- {
- "_id": "591ad7e274439c6eb52e99df",
- "age": 26,
- "name": "Arlene Carroll",
- "gender": "female",
- "company": "ELITA",
- "email": "arlenecarroll@elita.com",
- "phone": "+1 (998) 497-3751"
- },
- {
- "_id": "591ad7e271852e5766fad809",
- "age": 22,
- "name": "Tamra Spence",
- "gender": "female",
- "company": "ARTWORLDS",
- "email": "tamraspence@artworlds.com",
- "phone": "+1 (963) 516-2492"
- },
- {
- "_id": "591ad7e28c9165c4372744f7",
- "age": 29,
- "name": "Alice Goodman",
- "gender": "female",
- "company": "ZILLIDIUM",
- "email": "alicegoodman@zillidium.com",
- "phone": "+1 (829) 577-2972"
- },
- {
- "_id": "591ad7e2c2a9121f713f15c3",
- "age": 27,
- "name": "Clay Washington",
- "gender": "male",
- "company": "EXOSTREAM",
- "email": "claywashington@exostream.com",
- "phone": "+1 (926) 460-3699"
- },
- {
- "_id": "591ad7e2c99d41ce0347ac8f",
- "age": 38,
- "name": "Navarro Walsh",
- "gender": "male",
- "company": "ILLUMITY",
- "email": "navarrowalsh@illumity.com",
- "phone": "+1 (896) 564-3270"
- },
- {
- "_id": "591ad7e25e7c6ff0785d1337",
- "age": 22,
- "name": "Alexandra Hughes",
- "gender": "female",
- "company": "TASMANIA",
- "email": "alexandrahughes@tasmania.com",
- "phone": "+1 (977) 509-3599"
- },
- {
- "_id": "591ad7e2acb8a5785b6fd512",
- "age": 40,
- "name": "Vonda Oliver",
- "gender": "female",
- "company": "NEPTIDE",
- "email": "vondaoliver@neptide.com",
- "phone": "+1 (836) 595-2260"
- },
- {
- "_id": "591ad7e20543a9fc7bc33515",
- "age": 36,
- "name": "Christa Nixon",
- "gender": "female",
- "company": "GLASSTEP",
- "email": "christanixon@glasstep.com",
- "phone": "+1 (966) 551-2149"
- },
- {
- "_id": "591ad7e21b8e73ba4dbf7c9a",
- "age": 34,
- "name": "Weber Hurst",
- "gender": "male",
- "company": "SLUMBERIA",
- "email": "weberhurst@slumberia.com",
- "phone": "+1 (943) 516-3449"
- },
- {
- "_id": "591ad7e282b9cb56357b42db",
- "age": 27,
- "name": "Rasmussen Kramer",
- "gender": "male",
- "company": "MUSIX",
- "email": "rasmussenkramer@musix.com",
- "phone": "+1 (891) 553-3264"
- },
- {
- "_id": "591ad7e2287c587e3a04e80c",
- "age": 30,
- "name": "Mayra Beasley",
- "gender": "female",
- "company": "BRAINCLIP",
- "email": "mayrabeasley@brainclip.com",
- "phone": "+1 (958) 576-2642"
- },
- {
- "_id": "591ad7e26245135989367fa8",
- "age": 20,
- "name": "Nunez Ortiz",
- "gender": "male",
- "company": "KYAGURU",
- "email": "nunezortiz@kyaguru.com",
- "phone": "+1 (906) 591-3563"
- },
- {
- "_id": "591ad7e23248cee3b84bde40",
- "age": 39,
- "name": "Michael Foreman",
- "gender": "male",
- "company": "DANCITY",
- "email": "michaelforeman@dancity.com",
- "phone": "+1 (848) 400-3539"
- },
- {
- "_id": "591ad7e23ae236a1d59d07ee",
- "age": 36,
- "name": "Virgie Wheeler",
- "gender": "female",
- "company": "XIIX",
- "email": "virgiewheeler@xiix.com",
- "phone": "+1 (831) 400-2814"
- },
- {
- "_id": "591ad7e2d8b9e3c0c31d770d",
- "age": 31,
- "name": "Levy Hoover",
- "gender": "male",
- "company": "CANDECOR",
- "email": "levyhoover@candecor.com",
- "phone": "+1 (843) 428-2780"
- },
- {
- "_id": "591ad7e2badb7200ca06a483",
- "age": 21,
- "name": "Battle Stanton",
- "gender": "male",
- "company": "CALCULA",
- "email": "battlestanton@calcula.com",
- "phone": "+1 (861) 522-3951"
- },
- {
- "_id": "591ad7e27fd1a4455ccf406c",
- "age": 24,
- "name": "Church Lynn",
- "gender": "male",
- "company": "DAISU",
- "email": "churchlynn@daisu.com",
- "phone": "+1 (896) 425-3854"
- }
-]
+ _id: '591ad7e2d1b6119887420af5',
+ age: 36,
+ name: 'Salas Mccarthy',
+ gender: 'male',
+ company: 'MAKINGWAY',
+ email: 'salasmccarthy@makingway.com',
+ phone: '+1 (905) 546-3931',
+ },
+ {
+ _id: '591ad7e2918b0ba1231b582d',
+ age: 29,
+ name: 'Jodi Graham',
+ gender: 'female',
+ company: 'BITREX',
+ email: 'jodigraham@bitrex.com',
+ phone: '+1 (861) 596-2691',
+ },
+ {
+ _id: '591ad7e2bc19d181dcb64d57',
+ age: 34,
+ name: 'Hollie Hardin',
+ gender: 'female',
+ company: 'ZENSURE',
+ email: 'holliehardin@zensure.com',
+ phone: '+1 (822) 410-2433',
+ },
+ {
+ _id: '591ad7e224d2fa7216132561',
+ age: 26,
+ name: 'Bullock Cole',
+ gender: 'male',
+ company: 'ZILPHUR',
+ email: 'bullockcole@zilphur.com',
+ phone: '+1 (839) 563-3350',
+ },
+ {
+ _id: '591ad7e206c3fb3043ccf8a8',
+ age: 30,
+ name: 'Peterson Mosley',
+ gender: 'male',
+ company: 'MOBILDATA',
+ email: 'petersonmosley@mobildata.com',
+ phone: '+1 (974) 547-3461',
+ },
+ {
+ _id: '591ad7e20a180de908b0960e',
+ age: 34,
+ name: 'Lucille Jackson',
+ gender: 'female',
+ company: 'KINETICUT',
+ email: 'lucillejackson@kineticut.com',
+ phone: '+1 (845) 443-3594',
+ },
+ {
+ _id: '591ad7e2768b0cf4837ecf35',
+ age: 40,
+ name: 'Cooper Leonard',
+ gender: 'male',
+ company: 'CHORIZON',
+ email: 'cooperleonard@chorizon.com',
+ phone: '+1 (817) 418-2290',
+ },
+ {
+ _id: '591ad7e270a640cf8f8a3e44',
+ age: 27,
+ name: 'Iris Shepherd',
+ gender: 'female',
+ company: 'IDEALIS',
+ email: 'irisshepherd@idealis.com',
+ phone: '+1 (858) 599-3628',
+ },
+ {
+ _id: '591ad7e222ddd244aaba0315',
+ age: 31,
+ name: 'Oneil Head',
+ gender: 'male',
+ company: 'LIMOZEN',
+ email: 'oneilhead@limozen.com',
+ phone: '+1 (894) 440-3396',
+ },
+ {
+ _id: '591ad7e2d36847b5e648587b',
+ age: 28,
+ name: 'Swanson Singleton',
+ gender: 'male',
+ company: 'NSPIRE',
+ email: 'swansonsingleton@nspire.com',
+ phone: '+1 (817) 510-2480',
+ },
+ {
+ _id: '591ad7e2b78092f9fb866779',
+ age: 37,
+ name: 'Sutton Odom',
+ gender: 'male',
+ company: 'GLUKGLUK',
+ email: 'suttonodom@glukgluk.com',
+ phone: '+1 (961) 424-2812',
+ },
+ {
+ _id: '591ad7e222736aa66a9b35cc',
+ age: 31,
+ name: 'Chandler Kirk',
+ gender: 'male',
+ company: 'EWAVES',
+ email: 'chandlerkirk@ewaves.com',
+ phone: '+1 (902) 524-3712',
+ },
+ {
+ _id: '591ad7e2ac3f9abecd5175a7',
+ age: 28,
+ name: 'Gentry Stanley',
+ gender: 'male',
+ company: 'GINK',
+ email: 'gentrystanley@gink.com',
+ phone: '+1 (878) 592-2331',
+ },
+ {
+ _id: '591ad7e2f79787dc605d61fb',
+ age: 28,
+ name: 'Paulette Guthrie',
+ gender: 'female',
+ company: 'SEQUITUR',
+ email: 'pauletteguthrie@sequitur.com',
+ phone: '+1 (820) 473-2926',
+ },
+ {
+ _id: '591ad7e2ff61553783737bc0',
+ age: 37,
+ name: 'Lesley Nash',
+ gender: 'female',
+ company: 'MELBACOR',
+ email: 'lesleynash@melbacor.com',
+ phone: '+1 (849) 414-2115',
+ },
+ {
+ _id: '591ad7e26f9c3fc95fa8e6f1',
+ age: 22,
+ name: 'Frye Oneil',
+ gender: 'male',
+ company: 'OVERPLEX',
+ email: 'fryeoneil@overplex.com',
+ phone: '+1 (999) 412-2403',
+ },
+ {
+ _id: '591ad7e2eee8b7cd857a29d0',
+ age: 40,
+ name: 'Christina Zamora',
+ gender: 'female',
+ company: 'REPETWIRE',
+ email: 'christinazamora@repetwire.com',
+ phone: '+1 (860) 504-3885',
+ },
+ {
+ _id: '591ad7e2be93544c81761053',
+ age: 25,
+ name: 'Earlene Dunn',
+ gender: 'female',
+ company: 'PHARMEX',
+ email: 'earlenedunn@pharmex.com',
+ phone: '+1 (831) 582-2974',
+ },
+ {
+ _id: '591ad7e2cb672de927940ef4',
+ age: 25,
+ name: 'Hoffman Pittman',
+ gender: 'male',
+ company: 'ENOMEN',
+ email: 'hoffmanpittman@enomen.com',
+ phone: '+1 (882) 420-3186',
+ },
+ {
+ _id: '591ad7e2aabaae50d75c21a3',
+ age: 35,
+ name: 'Wilson Tran',
+ gender: 'male',
+ company: 'CAXT',
+ email: 'wilsontran@caxt.com',
+ phone: '+1 (842) 529-3085',
+ },
+ {
+ _id: '591ad7e2bdd6104be85bdd87',
+ age: 22,
+ name: 'Hensley Hawkins',
+ gender: 'male',
+ company: 'LUDAK',
+ email: 'hensleyhawkins@ludak.com',
+ phone: '+1 (902) 566-3308',
+ },
+ {
+ _id: '591ad7e24796cbdc0eacb6c0',
+ age: 36,
+ name: 'Gray Schultz',
+ gender: 'male',
+ company: 'EBIDCO',
+ email: 'grayschultz@ebidco.com',
+ phone: '+1 (910) 532-2845',
+ },
+ {
+ _id: '591ad7e204425cc3b121279a',
+ age: 25,
+ name: 'Odonnell Livingston',
+ gender: 'male',
+ company: 'ANOCHA',
+ email: 'odonnelllivingston@anocha.com',
+ phone: '+1 (991) 422-2754',
+ },
+ {
+ _id: '591ad7e2997ac59b446d3a30',
+ age: 36,
+ name: 'Shelton Lindsay',
+ gender: 'male',
+ company: 'DENTREX',
+ email: 'sheltonlindsay@dentrex.com',
+ phone: '+1 (899) 567-2928',
+ },
+ {
+ _id: '591ad7e2646dad2ff456b035',
+ age: 40,
+ name: 'Mcclain Larson',
+ gender: 'male',
+ company: 'GENMOM',
+ email: 'mcclainlarson@genmom.com',
+ phone: '+1 (934) 508-3477',
+ },
+ {
+ _id: '591ad7e21e908e847ee6d3ea',
+ age: 27,
+ name: 'Miranda Branch',
+ gender: 'female',
+ company: 'ROCKYARD',
+ email: 'mirandabranch@rockyard.com',
+ phone: '+1 (989) 446-2387',
+ },
+ {
+ _id: '591ad7e2d7905d2fcaa1ce18',
+ age: 36,
+ name: 'Valencia Moreno',
+ gender: 'male',
+ company: 'KIOSK',
+ email: 'valenciamoreno@kiosk.com',
+ phone: '+1 (807) 449-2626',
+ },
+ {
+ _id: '591ad7e245e3c4ce18a92054',
+ age: 40,
+ name: 'Witt Leblanc',
+ gender: 'male',
+ company: 'ENERSAVE',
+ email: 'wittleblanc@enersave.com',
+ phone: '+1 (809) 491-3886',
+ },
+ {
+ _id: '591ad7e27f2c70583d1cf34f',
+ age: 32,
+ name: 'Glover Mccoy',
+ gender: 'male',
+ company: 'BYTREX',
+ email: 'glovermccoy@bytrex.com',
+ phone: '+1 (928) 470-2426',
+ },
+ {
+ _id: '591ad7e22768012595c933c9',
+ age: 25,
+ name: 'Billie Dunlap',
+ gender: 'female',
+ company: 'INQUALA',
+ email: 'billiedunlap@inquala.com',
+ phone: '+1 (903) 415-2136',
+ },
+ {
+ _id: '591ad7e22df8d07559a29904',
+ age: 21,
+ name: 'Bridget Hill',
+ gender: 'female',
+ company: 'TRIBALOG',
+ email: 'bridgethill@tribalog.com',
+ phone: '+1 (954) 461-3390',
+ },
+ {
+ _id: '591ad7e201b2bddbc81ae05e',
+ age: 30,
+ name: 'Dawson Clements',
+ gender: 'male',
+ company: 'EURON',
+ email: 'dawsonclements@euron.com',
+ phone: '+1 (926) 570-3444',
+ },
+ {
+ _id: '591ad7e2c2aeb820e77c1d9a',
+ age: 31,
+ name: 'Valdez Johnson',
+ gender: 'male',
+ company: 'RETRACK',
+ email: 'valdezjohnson@retrack.com',
+ phone: '+1 (841) 506-2428',
+ },
+ {
+ _id: '591ad7e2370ff047048bd688',
+ age: 31,
+ name: 'Nichole Dickerson',
+ gender: 'female',
+ company: 'NEOCENT',
+ email: 'nicholedickerson@neocent.com',
+ phone: '+1 (945) 437-3591',
+ },
+ {
+ _id: '591ad7e2b77affba5a8f8603',
+ age: 34,
+ name: 'Madden Weaver',
+ gender: 'male',
+ company: 'VERBUS',
+ email: 'maddenweaver@verbus.com',
+ phone: '+1 (810) 598-3145',
+ },
+ {
+ _id: '591ad7e21e692cc8247b1d83',
+ age: 26,
+ name: 'Larsen Benson',
+ gender: 'male',
+ company: 'ISOSURE',
+ email: 'larsenbenson@isosure.com',
+ phone: '+1 (890) 435-2219',
+ },
+ {
+ _id: '591ad7e2de06284f2d2a8d19',
+ age: 37,
+ name: 'Barnes Gaines',
+ gender: 'male',
+ company: 'RODEOCEAN',
+ email: 'barnesgaines@rodeocean.com',
+ phone: '+1 (824) 484-2693',
+ },
+ {
+ _id: '591ad7e20d9d8224dfbd292f',
+ age: 28,
+ name: 'Pacheco Landry',
+ gender: 'male',
+ company: 'METROZ',
+ email: 'pachecolandry@metroz.com',
+ phone: '+1 (813) 525-3821',
+ },
+ {
+ _id: '591ad7e2c5348da6a981a148',
+ age: 21,
+ name: 'Richard Alexander',
+ gender: 'male',
+ company: 'GADTRON',
+ email: 'richardalexander@gadtron.com',
+ phone: '+1 (911) 513-3007',
+ },
+ {
+ _id: '591ad7e2ca9ef31ba3b67d4f',
+ age: 22,
+ name: 'Stone Campos',
+ gender: 'male',
+ company: 'TETAK',
+ email: 'stonecampos@tetak.com',
+ phone: '+1 (879) 440-3672',
+ },
+ {
+ _id: '591ad7e2ff5a9796c8470151',
+ age: 31,
+ name: 'Walter Randall',
+ gender: 'male',
+ company: 'EQUITAX',
+ email: 'walterrandall@equitax.com',
+ phone: '+1 (927) 563-3777',
+ },
+ {
+ _id: '591ad7e272c6b6c1241b3a4a',
+ age: 27,
+ name: 'Copeland Compton',
+ gender: 'male',
+ company: 'MAXIMIND',
+ email: 'copelandcompton@maximind.com',
+ phone: '+1 (829) 599-2574',
+ },
+ {
+ _id: '591ad7e2220c6caa9e2c444d',
+ age: 30,
+ name: 'Lorie Irwin',
+ gender: 'female',
+ company: 'ELPRO',
+ email: 'lorieirwin@elpro.com',
+ phone: '+1 (938) 584-2368',
+ },
+ {
+ _id: '591ad7e2942d603032f1ebda',
+ age: 35,
+ name: 'Buck Roth',
+ gender: 'male',
+ company: 'COMTRACT',
+ email: 'buckroth@comtract.com',
+ phone: '+1 (830) 585-3168',
+ },
+ {
+ _id: '591ad7e2c23efccd2fcd5b2e',
+ age: 31,
+ name: 'Mamie Robinson',
+ gender: 'female',
+ company: 'ZOMBOID',
+ email: 'mamierobinson@zomboid.com',
+ phone: '+1 (845) 481-3222',
+ },
+ {
+ _id: '591ad7e285109fadbf0f9c01',
+ age: 33,
+ name: 'Bryan Stone',
+ gender: 'male',
+ company: 'PODUNK',
+ email: 'bryanstone@podunk.com',
+ phone: '+1 (971) 469-3832',
+ },
+ {
+ _id: '591ad7e25abc328c2cc42283',
+ age: 37,
+ name: 'Benson Lyons',
+ gender: 'male',
+ company: 'FUTURITY',
+ email: 'bensonlyons@futurity.com',
+ phone: '+1 (964) 536-3522',
+ },
+ {
+ _id: '591ad7e28fa81611cdf5066a',
+ age: 37,
+ name: 'Sally Finley',
+ gender: 'female',
+ company: 'ZYTRAC',
+ email: 'sallyfinley@zytrac.com',
+ phone: '+1 (953) 506-2428',
+ },
+ {
+ _id: '591ad7e271c5882aa5452601',
+ age: 26,
+ name: 'Callahan Mckee',
+ gender: 'male',
+ company: 'ACCUPRINT',
+ email: 'callahanmckee@accuprint.com',
+ phone: '+1 (842) 400-3570',
+ },
+ {
+ _id: '591ad7e2275e787c5d9eea26',
+ age: 25,
+ name: 'Ines Hamilton',
+ gender: 'female',
+ company: 'PROSURE',
+ email: 'ineshamilton@prosure.com',
+ phone: '+1 (976) 485-2663',
+ },
+ {
+ _id: '591ad7e2d8790e386b671ec6',
+ age: 38,
+ name: 'Mcknight Abbott',
+ gender: 'male',
+ company: 'MAXEMIA',
+ email: 'mcknightabbott@maxemia.com',
+ phone: '+1 (960) 600-3920',
+ },
+ {
+ _id: '591ad7e2a1cae1e4f17d8db2',
+ age: 28,
+ name: 'Tanisha Ross',
+ gender: 'female',
+ company: 'SYNKGEN',
+ email: 'tanishaross@synkgen.com',
+ phone: '+1 (920) 502-3204',
+ },
+ {
+ _id: '591ad7e2f816fd6848bc03a3',
+ age: 22,
+ name: 'Pam Webb',
+ gender: 'female',
+ company: 'VALREDA',
+ email: 'pamwebb@valreda.com',
+ phone: '+1 (926) 442-2683',
+ },
+ {
+ _id: '591ad7e208585adb332ac653',
+ age: 29,
+ name: 'Bobbi Mays',
+ gender: 'female',
+ company: 'PARLEYNET',
+ email: 'bobbimays@parleynet.com',
+ phone: '+1 (940) 577-3487',
+ },
+ {
+ _id: '591ad7e2f4b29cbd1744b14e',
+ age: 27,
+ name: 'Snider Sandoval',
+ gender: 'male',
+ company: 'GRONK',
+ email: 'snidersandoval@gronk.com',
+ phone: '+1 (903) 526-2655',
+ },
+ {
+ _id: '591ad7e23a3f54209ec9deba',
+ age: 33,
+ name: 'Fitzpatrick Weiss',
+ gender: 'male',
+ company: 'MICROLUXE',
+ email: 'fitzpatrickweiss@microluxe.com',
+ phone: '+1 (894) 494-2135',
+ },
+ {
+ _id: '591ad7e229d21e1b7723c044',
+ age: 27,
+ name: 'Kimberly Brown',
+ gender: 'female',
+ company: 'SPACEWAX',
+ email: 'kimberlybrown@spacewax.com',
+ phone: '+1 (832) 481-2926',
+ },
+ {
+ _id: '591ad7e247e285f0c563ac94',
+ age: 20,
+ name: 'Fisher Kent',
+ gender: 'male',
+ company: 'ORBIN',
+ email: 'fisherkent@orbin.com',
+ phone: '+1 (962) 523-3956',
+ },
+ {
+ _id: '591ad7e274439c6eb52e99df',
+ age: 26,
+ name: 'Arlene Carroll',
+ gender: 'female',
+ company: 'ELITA',
+ email: 'arlenecarroll@elita.com',
+ phone: '+1 (998) 497-3751',
+ },
+ {
+ _id: '591ad7e271852e5766fad809',
+ age: 22,
+ name: 'Tamra Spence',
+ gender: 'female',
+ company: 'ARTWORLDS',
+ email: 'tamraspence@artworlds.com',
+ phone: '+1 (963) 516-2492',
+ },
+ {
+ _id: '591ad7e28c9165c4372744f7',
+ age: 29,
+ name: 'Alice Goodman',
+ gender: 'female',
+ company: 'ZILLIDIUM',
+ email: 'alicegoodman@zillidium.com',
+ phone: '+1 (829) 577-2972',
+ },
+ {
+ _id: '591ad7e2c2a9121f713f15c3',
+ age: 27,
+ name: 'Clay Washington',
+ gender: 'male',
+ company: 'EXOSTREAM',
+ email: 'claywashington@exostream.com',
+ phone: '+1 (926) 460-3699',
+ },
+ {
+ _id: '591ad7e2c99d41ce0347ac8f',
+ age: 38,
+ name: 'Navarro Walsh',
+ gender: 'male',
+ company: 'ILLUMITY',
+ email: 'navarrowalsh@illumity.com',
+ phone: '+1 (896) 564-3270',
+ },
+ {
+ _id: '591ad7e25e7c6ff0785d1337',
+ age: 22,
+ name: 'Alexandra Hughes',
+ gender: 'female',
+ company: 'TASMANIA',
+ email: 'alexandrahughes@tasmania.com',
+ phone: '+1 (977) 509-3599',
+ },
+ {
+ _id: '591ad7e2acb8a5785b6fd512',
+ age: 40,
+ name: 'Vonda Oliver',
+ gender: 'female',
+ company: 'NEPTIDE',
+ email: 'vondaoliver@neptide.com',
+ phone: '+1 (836) 595-2260',
+ },
+ {
+ _id: '591ad7e20543a9fc7bc33515',
+ age: 36,
+ name: 'Christa Nixon',
+ gender: 'female',
+ company: 'GLASSTEP',
+ email: 'christanixon@glasstep.com',
+ phone: '+1 (966) 551-2149',
+ },
+ {
+ _id: '591ad7e21b8e73ba4dbf7c9a',
+ age: 34,
+ name: 'Weber Hurst',
+ gender: 'male',
+ company: 'SLUMBERIA',
+ email: 'weberhurst@slumberia.com',
+ phone: '+1 (943) 516-3449',
+ },
+ {
+ _id: '591ad7e282b9cb56357b42db',
+ age: 27,
+ name: 'Rasmussen Kramer',
+ gender: 'male',
+ company: 'MUSIX',
+ email: 'rasmussenkramer@musix.com',
+ phone: '+1 (891) 553-3264',
+ },
+ {
+ _id: '591ad7e2287c587e3a04e80c',
+ age: 30,
+ name: 'Mayra Beasley',
+ gender: 'female',
+ company: 'BRAINCLIP',
+ email: 'mayrabeasley@brainclip.com',
+ phone: '+1 (958) 576-2642',
+ },
+ {
+ _id: '591ad7e26245135989367fa8',
+ age: 20,
+ name: 'Nunez Ortiz',
+ gender: 'male',
+ company: 'KYAGURU',
+ email: 'nunezortiz@kyaguru.com',
+ phone: '+1 (906) 591-3563',
+ },
+ {
+ _id: '591ad7e23248cee3b84bde40',
+ age: 39,
+ name: 'Michael Foreman',
+ gender: 'male',
+ company: 'DANCITY',
+ email: 'michaelforeman@dancity.com',
+ phone: '+1 (848) 400-3539',
+ },
+ {
+ _id: '591ad7e23ae236a1d59d07ee',
+ age: 36,
+ name: 'Virgie Wheeler',
+ gender: 'female',
+ company: 'XIIX',
+ email: 'virgiewheeler@xiix.com',
+ phone: '+1 (831) 400-2814',
+ },
+ {
+ _id: '591ad7e2d8b9e3c0c31d770d',
+ age: 31,
+ name: 'Levy Hoover',
+ gender: 'male',
+ company: 'CANDECOR',
+ email: 'levyhoover@candecor.com',
+ phone: '+1 (843) 428-2780',
+ },
+ {
+ _id: '591ad7e2badb7200ca06a483',
+ age: 21,
+ name: 'Battle Stanton',
+ gender: 'male',
+ company: 'CALCULA',
+ email: 'battlestanton@calcula.com',
+ phone: '+1 (861) 522-3951',
+ },
+ {
+ _id: '591ad7e27fd1a4455ccf406c',
+ age: 24,
+ name: 'Church Lynn',
+ gender: 'male',
+ company: 'DAISU',
+ email: 'churchlynn@daisu.com',
+ phone: '+1 (896) 425-3854',
+ },
+];
diff --git a/domain/security.md b/domain/security.md
index 1c5216ae..0ee6e57a 100644
--- a/domain/security.md
+++ b/domain/security.md
@@ -1,20 +1,19 @@
-Security
-==
+# Security
## Encryption
#### Symmetrical Encryption
-- Symmetrical encryption is a type of encryption where one key can be used to encrypt messages and also decrypt the same message.
-- Symmetrical encryption is usually much less computationally expensive as compared to asymmetric encryption.
-- Often called "shared secret" encryption, or "secret key" encryption.
-- To use a symmetric encryption scheme, the sender and receiver must securely share a key in advance. This sharing can be done via asymmetric encryption.
+* Symmetrical encryption is a type of encryption where one key can be used to encrypt messages and also decrypt the same message.
+* Symmetrical encryption is usually much less computationally expensive as compared to asymmetric encryption.
+* Often called "shared secret" encryption, or "secret key" encryption.
+* To use a symmetric encryption scheme, the sender and receiver must securely share a key in advance. This sharing can be done via asymmetric encryption.
#### Asymmetric Encryption
-- A pair of keys are required: a **private key** and a **public key**. Public keys can be shared with anyone while private keys should be kept secret and known only to the owner.
-- A private key can be used to decrypt a message encrypted by a public key. A successful decryption verifies that the holder possesses the private key.
-- Also known as public key cryptography.
+* A pair of keys are required: a **private key** and a **public key**. Public keys can be shared with anyone while private keys should be kept secret and known only to the owner.
+* A private key can be used to decrypt a message encrypted by a public key. A successful decryption verifies that the holder possesses the private key.
+* Also known as public key cryptography.
## Public Key Infrastructure
@@ -22,7 +21,7 @@ A public key infrastructure (PKI) is a system for the creation, storage, and dis
###### References
-- https://www.wikiwand.com/en/Public_key_infrastructure
+* https://www.wikiwand.com/en/Public_key_infrastructure
## SSH
@@ -64,4 +63,4 @@ Authentication using SSH key pairs begins after the symmetric encryption has bee
###### References
-- https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process
+* https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process
diff --git a/domain/snake-game/snake-game.md b/domain/snake-game/snake-game.md
index 6f7f1fc4..bab356a1 100644
--- a/domain/snake-game/snake-game.md
+++ b/domain/snake-game/snake-game.md
@@ -1,77 +1,25 @@
-Snake Game
-==
+# Snake Game
Design a snake game that is to be played in web browser.
Client: React + Redux
-Rendering:
-Pixel-based graphics. Depending on the intended resolution, can divide the screen into N * M pixels. Can dynamically calculate the size of each pixel.
+Rendering: Pixel-based graphics. Depending on the intended resolution, can divide the screen into N \* M pixels. Can dynamically calculate the size of each pixel.
-Fruit: One pixel.
-Snake body: One pixel width made up of connected pixels.
+Fruit: One pixel. Snake body: One pixel width made up of connected pixels.
-Model:
-{
- fruit: {
- x, y
- },
- snake: {
- points: [(x, y), ...] # head is at index 0
- direction: north/south/east/west
- }
- speed: 500,
- points: 0
-}
+Model: { fruit: { x, y }, snake: { points: [(x, y), ...] # head is at index 0 direction: north/south/east/west } speed: 500, points: 0 }
-function update() {
- next_loc = points[0] + (x, y) # Depends on the direction
- if (snake.points.find(next_loc) > 0) {
- // die
- }
- let pts = snake.points;
- if (!isEqual(next_loc, fruit)) {
- pts = points.removeLast();
- } else {
- generate_fruit();
- points++;
- }
- snake.points = [next_loc, ...pts];
+function update() { next_loc = points[0] + (x, y) # Depends on the direction if (snake.points.find(next_loc) > 0) { // die } let pts = snake.points; if (!isEqual(next_loc, fruit)) { pts = points.removeLast(); } else { generate_fruit(); points++; } snake.points = [next_loc, ...pts];
- // Boundary checking -> die
-}
+// Boundary checking -> die }
-function generate_fruit() {
- // Cannot generate on my own body.
+function generate_fruit() { // Cannot generate on my own body.
- // First approach: while on body, generate
- let next_fruit_location = random_location();
- while (snake.points.find(next_fruit_location) > 0) {
- next_fruit_location = random_location();
- }
- fruit = next_fruit_location
+// First approach: while on body, generate let next_fruit_location = random_location(); while (snake.points.find(next_fruit_location) > 0) { next_fruit_location = random_location(); } fruit = next_fruit_location
- // Second approach: brute force
- for (let i = 0; i < rows; i++) {
- for (let j = 0; j < cols; j++) {
- let point = { x: i, y: j }
- if (snake.points.find(next_fruit_location) === -1) {
- fruit = point
- }
- }
- }
+// Second approach: brute force for (let i = 0; i < rows; i++) { for (let j = 0; j < cols; j++) { let point = { x: i, y: j } if (snake.points.find(next_fruit_location) === -1) { fruit = point } } }
- // Third approach: brute force with random
- const available_points = []
- for (let i = 0; i < rows; i++) {
- for (let j = 0; j < cols; j++) {
- let point = { x: i, y: j }
- if (snake.points.find(next_fruit_location) === -1) {
- available_points.push(point);
- }
- }
- }
- fruit = _.sample(available_points);
-}
+// Third approach: brute force with random const available*points = [] for (let i = 0; i < rows; i++) { for (let j = 0; j < cols; j++) { let point = { x: i, y: j } if (snake.points.find(next_fruit_location) === -1) { available_points.push(point); } } } fruit = *.sample(available_points); }
setInterval(update, speed);
diff --git a/domain/software-engineering.md b/domain/software-engineering.md
index dfb3251c..beb1d35c 100644
--- a/domain/software-engineering.md
+++ b/domain/software-engineering.md
@@ -1,22 +1,21 @@
-Software Engineering
-==
+# Software Engineering
## What is the difference between an interface and abstract class?
**Abstract Class**
-- For an abstract class, a method must be declared as abstract. An abstract method doesn't have an implementation.
-- The Abstract methods can be declared with Access modifiers like public, internal, protected, etc. When implementing these methods in a subclass, you must define them with the same (or a less restricted) visibility.
-- Abstract classes can contain variables and concrete methods.
-- A class can Inherit only one Abstract class. Hence multiple inheritance is not possible for an Abstract class.
-- Abstract is object-oriented. It offers the basic data an 'object' should have and/or functions it should be able to do. It is concerned with the object's basic characteristics: what it has and what it can do. Hence objects which inherit from the same abstract class share the basic characteristics (generalization).
-- Abstract class establishes "is a" relation with concrete classes.
+* For an abstract class, a method must be declared as abstract. An abstract method doesn't have an implementation.
+* The Abstract methods can be declared with Access modifiers like public, internal, protected, etc. When implementing these methods in a subclass, you must define them with the same (or a less restricted) visibility.
+* Abstract classes can contain variables and concrete methods.
+* A class can Inherit only one Abstract class. Hence multiple inheritance is not possible for an Abstract class.
+* Abstract is object-oriented. It offers the basic data an 'object' should have and/or functions it should be able to do. It is concerned with the object's basic characteristics: what it has and what it can do. Hence objects which inherit from the same abstract class share the basic characteristics (generalization).
+* Abstract class establishes "is a" relation with concrete classes.
**Interface**
-- For an interface, all the methods are abstract by default. So one cannot declare variables or concrete methods in interfaces.
-- All methods declared in an interface must be public.
-- Interfaces cannot contain variables and concrete methods except constants.
-- A class can implement many interfaces. Hence multiple interface inheritance is possible.
-- Interface is functionality-oriented. It defines functionalities an object should have. Regardless what object it is, as long as it can do these functionalities, which are defined in the interface, it's fine. It ignores everything else. An object/class can contain several (groups of) functionalities; hence it is possible for a class to implement multiple interfaces.
-- Interface provides "has a" capability for classes.
+* For an interface, all the methods are abstract by default. So one cannot declare variables or concrete methods in interfaces.
+* All methods declared in an interface must be public.
+* Interfaces cannot contain variables and concrete methods except constants.
+* A class can implement many interfaces. Hence multiple interface inheritance is possible.
+* Interface is functionality-oriented. It defines functionalities an object should have. Regardless what object it is, as long as it can do these functionalities, which are defined in the interface, it's fine. It ignores everything else. An object/class can contain several (groups of) functionalities; hence it is possible for a class to implement multiple interfaces.
+* Interface provides "has a" capability for classes.
diff --git a/front-end/accessibility.md b/front-end/accessibility.md
index e6f61451..df1d8ed8 100644
--- a/front-end/accessibility.md
+++ b/front-end/accessibility.md
@@ -1,10 +1,9 @@
-Accessibility
-==
+# Accessibility
## Glossary
-- **Accessibility** -
-- **WAI-ARIA** - Web Accessibility Initiative - Accessible Rich Internet Applications. Commonly shortened to ARIA.
+* **Accessibility** -
+* **WAI-ARIA** - Web Accessibility Initiative - Accessible Rich Internet Applications. Commonly shortened to ARIA.
## What is Accessibility?
@@ -14,71 +13,73 @@ Making sure that the content and the websites we create are usable to people wit
The following is a checklist that contains recommendations for implementing HTML-related principles and techniques for those seeking WCAG 2.0 conformance (it is NOT the Web Content Accessibility Guidelines (WCAG) 2.0).
-- **Perceivable** - Web content is made available to the senses - sight, hearing, and/or touch.
- - Text Alternatives: Provide text alternatives for any non-text content.
- - Time-based Media: Provide alternatives for time-based media.
- - Adaptable: Create content that can be presented in different ways (for example simpler layout) without losing information or structure.
- - Distinguishable: Make it easier for users to see and hear content including separating foreground from background.
-- **Operable** - Interface forms, controls, and navigation are operable.
- - Keyboard Accessible: Make all functionality available from a keyboard.
- - Enough Time: Provide users enough time to read and use content.
- - Seizures: Do not design content in a way that is known to cause seizures.
- - Navigable: Provide ways to help users navigate, find content, and determine where they are.
-- **Understandable** - Content and interface are understandable.
- - Readable: Make text content readable and understandable.
- - Predictable: Make Web pages appear and operate in predictable ways.
- - Input Assistance: Help users avoid and correct mistakes.
-- **Robust** - Content can be used reliably by a wide variety of user agents, including assistive technologies.
- - Compatible: Maximize compatibility with current and future user agents, including assistive technologies.
+* **Perceivable** - Web content is made available to the senses - sight, hearing, and/or touch.
+ * Text Alternatives: Provide text alternatives for any non-text content.
+ * Time-based Media: Provide alternatives for time-based media.
+ * Adaptable: Create content that can be presented in different ways (for example simpler layout) without losing information or structure.
+ * Distinguishable: Make it easier for users to see and hear content including separating foreground from background.
+* **Operable** - Interface forms, controls, and navigation are operable.
+ * Keyboard Accessible: Make all functionality available from a keyboard.
+ * Enough Time: Provide users enough time to read and use content.
+ * Seizures: Do not design content in a way that is known to cause seizures.
+ * Navigable: Provide ways to help users navigate, find content, and determine where they are.
+* **Understandable** - Content and interface are understandable.
+ * Readable: Make text content readable and understandable.
+ * Predictable: Make Web pages appear and operate in predictable ways.
+ * Input Assistance: Help users avoid and correct mistakes.
+* **Robust** - Content can be used reliably by a wide variety of user agents, including assistive technologies.
+ * Compatible: Maximize compatibility with current and future user agents, including assistive technologies.
**Source:** http://webaim.org/standards/wcag/checklist
## Focus
-- Making sure your application has a sensible tab order is important.
-- HTML forms and inputs are focusable and handle keyboard events by default.
-- Focus tab order relies on the DOM order in the HTML.
-- Be careful when using CSS when changing the order of elements on the screen, it can cause the order to be unintuitive and messy.
-- `tabindex` attribute:
- - `-1`: Not in the natural tab order, but programatically focusable using JavaScript with `focus()` method. Useful for off-screen content which later appears on screen. Children elements are **NOT** pulled out of the tab order.
- - `0`: In the natural tab order and can be programatically focused.
- - `1` (bigger than 1): In the natural tab order but jumped in front of the tab order regardless of where it is in the DOM. It can be considered an anti-pattern.
-- Add focus behavior to interactive controls, like buttons, tabs, dropdowns, stuff that users will interactive with.
-- Use skip links to allow users to skip directly to the main content without having to tab through all the navigation.
-- `document.activeElement` is useful in tracking the current element that has focus on.
+* Making sure your application has a sensible tab order is important.
+* HTML forms and inputs are focusable and handle keyboard events by default.
+* Focus tab order relies on the DOM order in the HTML.
+* Be careful when using CSS when changing the order of elements on the screen, it can cause the order to be unintuitive and messy.
+* `tabindex` attribute:
+ * `-1`: Not in the natural tab order, but programatically focusable using JavaScript with `focus()` method. Useful for off-screen content which later appears on screen. Children elements are **NOT** pulled out of the tab order.
+ * `0`: In the natural tab order and can be programatically focused.
+ * `1` (bigger than 1): In the natural tab order but jumped in front of the tab order regardless of where it is in the DOM. It can be considered an anti-pattern.
+* Add focus behavior to interactive controls, like buttons, tabs, dropdowns, stuff that users will interactive with.
+* Use skip links to allow users to skip directly to the main content without having to tab through all the navigation.
+* `document.activeElement` is useful in tracking the current element that has focus on.
## Semantics
-- Using proper labeling not only helps accessibility but it makes the element easier to target for all users!
-- Use `