Rustam-Z 🚀 • 8 June 2021
This document will guide you through my steps for preparing for my Google interviews. Overall, it took me 2 years to crack the MAANG interview, including learning algorithms and data structures, practicing coding & problem-solving, and applying and passing all interviews.
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.
- 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 I have from the class.
- Naso Academy DS playlist
- The Last Algorithms Course You'll Need
- Jenny's DSA playlist
- programiz.com/dsa
- Data Structures by Google Software Engineer
- NeetCode videos: here’s one of them
- AlgoExpert Data Structures course
- 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
- LeetCode company tagged questions
- "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
Constraints, Ideas, Complexities, Code, and Tests
- Read the problem. Don’t immediately jump into coding!
- Understand inputs & outputs. Draw some examples on paper.
- Ask questions, and find constraints (edge cases). Find edge cases. Example questions: is it ASCII or Unicode? what is the Max value? is there a difference between capital letters and small letters?
- Thinking about the solution in mind. Divide problems into sub-problems. Ideas (whys, tradeoffs, solve simpler version, imagine helper functions - go from high level to low level).
- Evaluate the complexity.
- Think of a better alternative solution.
- Write code on paper.
- Debug your code on paper and test with new corner case inputs.
- Write code and write tests.
- More to read:
- 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.
- Linked lists
- Singly linked list
- Doubly linked list
- Stacks and Queues
- Trees
- DFS, BFS
- 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
- Algorithms
- Sorting
- Especially make sure you know heap sort, merge sort and quick sort.
- Searching
- Binary search
- Searching in linked lists, arrays, trees, graphs, dictionaries...
- Dynamic programming = problems, which are problems where the solution is composed of solutions to the same problem with smaller inputs.
- Bottom-up
- Top-down
- Backtracking = Backtracking is an algorithmic technique for solving problems recursively by trying to build a solution incrementally, one piece at a time.
- Greedy algorithms
- Recursion
- Sorting
- 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 the wrong input is provided?
- How long/big our input could be?
- Is size, speed, and using a build-in library a concern?
- How I would be testing?
- Tests: Zero, one, two, two to max-1, max, max+1
- Empty inputs, null values, 0 length, 1 element input, super long input.
- Questions to ask
- OOP
- how many calls 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 of an 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 out?
- DS: Can we use stack, queue, or 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 do we need to return a new one?
- Items in the array are all unique?
- Do we have repeated items in the array? OR can I use the same element twice?
- Does the 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 an array?
- Tree
- Is it a Binary Tree? (Each node has at most two children.)
- Is it a Binary Search Tree (BST)? (The left child is less than the parent, and the right child is greater.)
- If BST do we have duplicates? And on 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 (an 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 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./decree. pointers)
- Recursion
- recursion 1.000 call stack size is input too big?
- OOP
- More to read:
- Article by Sergey Sema
- InterviewPreparationGuide.pdf
- faang-interview.github.io
- docs.outtalent.com/guides
- Coding interview tips
- Interview Cake Coding Interview Tips
- Prepare for Your Google Interview: Coding
- Interview tips from Google Software Engineers
- Coding Mock Interview
- Tech Interview Process
- Preparing for a Technical Interview
- Prepare for your Google Interview: General Cognitive Ability
- Prepare for your Google Interview: Leadership