Rustam-Z 🚀 • 8 June 2021
Overall, it took me 1.5 years to crack the MAANG interview, including learning algorithms and data structures, practicing coding & problem-solving, and applying and passing all interviews. During this period I had interviews at Meta, and a successful interview at Bloomberg.
Join my Telegram channel: @cracking_maang, where I share MAANG interview preparation resources.
- Learning algorithms and data structures.
- Solving algorithms, and learning patterns and concepts.
- Practicing coding & problem-solving questions together with friends on the whiteboard.
- Learning System Design (I will write a separate article about System Design).
- Writing a resume.
- Applying to jobs.
- Preparing for a behavioral interview.
- Getting an interview invitation, passing all interviews, and getting an offer! 🍾
- I had a Data Structures class at university. Here are the notes from the class.
- Naso Academy DS playlist
- Jenny's DSA playlist
- Programiz.com/dsa
- Data Structures by a Google Software Engineer
- NeetCode videos: here’s one of them
- AlgoExpert Data Structures course
- Extra:
- "Systems Expert" from AlgoExpert
- "System Design Interview" book - 1st and 2nd editions
- "Grokking the System Design Interview" (educative.io)
- "Designing Data-Intensive Applications" book
- Tushar
- Big-O = how quickly the runtime grows relative to the input as the input gets arbitrarily large.
- Strings
- ASCII, Unicode
- How are strings implemented in your programming language (for example, is there a maximum length)?
- Search for substrings (for example, the Rabin-Karp algorithm).
- RegEx
- Arrays. Details of implementation in your programming language. For example, for C++ you need to know the implementation using pointers, and vectors. For vectors, you also need to know, for example, that it periodically does resize, and other similar details.
- Sorting algorithms. Especially make sure you know heap sort, merge sort and quick sort.
- Searching algorithms. Binary search.
- Linked lists
- Singly linked list
- Doubly linked list
- Algorithm: Fast and slow pointer
- Algorithm: Pointers with next
- Algorithm: Searching in linked lists
- Stacks and Queues
- Trees
- DFS (must learn)
- BFS (must know)
- Preorder (must know)
- Postorder
- Inorder
- Recursive and iterative problem solving
- Adding and removing elements
- Less common tree types (e.g., red black trees, B-trees) - what are they, how they differ from the binary trees, basic complexities, and how they are used. No need to know all the rotations in the RB-tree, for example.
- Tries
- Heaps
- Heap sort
- Using heaps for tracking top-K
- Allocating elements on a heap vs on a stack - what does it mean?
- Graphs
- DFS, BFS
- Topological search
- Shortest path
- Hash
- Hash functions
- Universal hash
- Algorithmic Paradigms
- Brute Force
- Greedy Algorithms
- Divide and Conquer
- Dynamic programming
- Dynamic programming = problems, which are problems where the solution is composed of solutions to the same problem with smaller inputs.
- Recursion
- Memoisation
- Backtracking = Backtracking is an algorithmic technique for solving problems recursively by trying to build a solution incrementally, one piece at a time.
- Button up
- Top down
- Interviewbit.com
- LeetCode Explore (only data structures cards)
- LeetCode Study Plan — Data Structure 1, Algorithm 1, Programming Skills 1
- "Cracking the Coding Interview" + CTCI problems in LeetCode
- LeetCode Study Plan — Data Structure 2, Algorithm 2, Programming Skills 2
- AlgoExpert video solutions
- Neetcode.io & NeetCode playlist
- Start with https://neetcode.io/practice?tab=neetcode250 250 if you have 0 knowledge in DS & A, otherwise start with TOP 150.
- LeetCode company-tagged questions, check LeetCode discussions, check Team Blind, check Glassdoor for recently asked questions.
List of patterns to solve algorithms: https://hackernoon.com/14-patterns-to-ace-any-coding-interview-question-c5bb3357f6ed
Top coding interview concepts:
- Heap top=O(1), insert=O(log n), remove=O(log n), heapify=O(n)
- Sliding window, two pointers
- Binary search O(log n)
- DFS & BFS
- Recursion (trees, graphs, backtracking, DP and more)
- HashMaps search=O(1), insert=O(1), remove=O(1)
Constraints, Ideas, Complexities, Code, and Tests
- Read the problem. Don’t immediately jump into coding!
- Understand inputs and outputs. Draw some examples on paper.
- Clarify requirements, ask questions (I am providing the list of questions below), and find constraints (edge cases). Example questions: Is it ASCII or Unicode? What is the max value? Is there a difference between capital letters and small letters?
- Think about the solution in your mind. Divide problems into sub-problems. Come up with different ideas (ask whys, think about trade-offs, solve simpler versions, imagine helper functions - go from high level to low level).
- Evaluate the complexity and trade-offs.
- Think of a better alternative solution.
- Write code on paper.
- Debug your code on paper and test with new corner case inputs.
- Write code. Write clean code.
- Write tests. Positive, negative, with edge-cases.
More to read:
-
Ask about edge cases (propose edge case). Explain and clarify, DS tradeoff, time and space complexity.
-
Questions
-
How am I receiving this data?
-
How should I output the result?
-
What if wrong input is provided?
How long/big our input could be?
Empty inputs, null values, 0 length, 1 element input, super long input.
-
-
Is size, speed, using not build-in library a concern?
-
How I would be testing? Tests: Zero, one, two, two to max-1, max, max+1
-
Questions to ask
-
OOP
- how many call will we get for each?
- Do we need caching if similar calls or similar work needs to be done?
- what if the data object is empty before calling the remove/pop/top methods?
-
Number (int, float)
- what if we have floats?
- zero?
- Can we have negative/positive numbers?
- what is the range on integer? max and min integer?
- dividing by zero?
- do we have leading 0s?
- Can we use bit manipulation? XOR?
-
Strings
- ASCII, Unicode UTF-8 (special chars)? Character encoding standards.
ProTip™, 👻, 60%, https://google.com - Only lower-case English characters, or? How to handle them?
- what if the string is empty, “ “, NULL, length is 1?
- spaces in string in the beginning or in the end?
- max and min length of string?
- sorted? can we sort it?
- DS: Can we use stack, queue, heap? If duplicates maybe use stack?
- ASCII, Unicode UTF-8 (special chars)? Character encoding standards.
-
Array
- Mutable or immutable array?
- Should it be in place? Or we need to return new one?
- Items in array are all unique?
- Do we have repeated items in array? OR can I use the same element twice?
- Does array contain NULLs?
- How to handle an empty array?
- What would I do if the array is super large.
- Can we sort the array?
- Do we need to preserve ORDER?
-
Sorting algorithm
- empty input, null input
- 1 element, very long input
- duplicate elements (sort on a second condition?)
- odd/even length input
- Collection with all elements equal?
- Garbage inside the collection?
-
Stack/queue
- removing elements from empty stack/queue
-
Linked list
- Single linked list or doubly linked list?
- Is it a circular linked list?
- How many nodes does the linked list contain?
- Null values for head/root
- Can it be empty?
- Values are sorted? Are there any duplicate numbers?
- Can I convert it to array?
-
Tree
1. Edge = link between any two nodes. 2. Height of node = number of edges from the deepest leaf to node. 3. Depth of a node = number of edges from the root to the node. 4. Height of a tree = height of the root node.
- Is it a Binary Tree? (Each node has at most two children.)
- Is it a Binary Search Tree (BST)? (Left child is less than the parent, and right child is greater.)
- If BST do we have duplicates? And in which side?
- Height of the tree? (Longest path from a leaf node to root.)
- Depth of a specific node? (Length of the path from the root to that node.)
- Is it a Balanced Tree? (Height of left and right subtrees differ by at most 1. Ensuring
O(logn)for insert and find) - Is it a Complete Binary Tree? (All levels are filled, except possibly the last one, and nodes are left-justified.)
- Is it a Full Binary Tree? (Each node has either 0 or 2 children.)
- Is it a Perfect Binary Tree? (All internal nodes have two children, and all leaves are at the same level.)
- Is it a Binary Heap? (Specifically for Binary Trees that follow the heap property.)
- Is it a Symmetric Tree (or Mirror Tree)? (The left subtree of one node is a mirror image of the right subtree of the other node.)
-
Graph
- Directed (one-way street) or undirected (two-way)?
- Connected graph(undirected graph, there is always a path to the node) or not-connected?
- Strongly connected graph (directed graph, when there is always a route)
- Cyclic or Acyclic? (Does the graph contain any cycles, or is it a directed acyclic graph (DAG)?)
- Weighted or Unweighted? (Are there numerical values assigned to the edges?)
- Tree or Forest? (Is the graph a connected acyclic graph, or is it a collection of disconnected trees?)
- Complete or Incomplete? (Does every pair of distinct vertices have an edge between them?) From any node (vertex) you can do to any node.
- Should I use DFS or BFS?
- Dijkstra?
-
Loops
- while loops running forever (properly incre./decre. pointers)
-
Recursion
- recursion 1.000 call stack size is input it too big?
-
Interviews are not only about evaluating your technical knowledge. Explain your thought process and show how you approach problem-solving in a structured way step by step.
Many questions asked by interviewers are open-ended, so ask good questions to clarify a full set of criteria to solve the problem and clarify requirements.
Always, always, always ask clarifying questions before jumping to a solution.
Try thinking of different solutions to a given problem and explain why you came up with this solution or this code. Compare your solutions, compare complexities, and think about their trade-offs.
Overall, the interview should be like a dialogue — show how it is to work with you, how collaborative you are.
