This page will provide all the tools and tricks for fellow CSE undergraduates to excel in coding interviews. It includes: Data Structures, Programming Languages, Sorting Algorithms, Preparation, & Common Questions. Designed by: Nicole Trappe
Sorting data and everything, including rebalancing, can be done in O(log n).
Generally use unique values (don't want duplicates).
Operation | Average | Worst |
---|---|---|
Insert | O(log n) | O(n) |
Remove | O(log n) | O(n) |
Search | O(log n) | O(n) |
Storing and accessing sequential data, temporarily storing, as an IO buffer (when reading from a file), lookup table, and hack for multiple return values.
Can implement a dynamic array from static ones by continuously allocating double the space once the array is full.
Operation | Average | Worst |
---|---|---|
Access | O(1) | O(1) |
Append | --- | O(1) |
Insert | --- | O(n) |
Remove | --- | O(n) |
Search | O(n) | O(n) |
Useful in lists, queues, and stacks. Often used for circular (round robin) or adjacency lists.
Singly-linked will save up on space and it's simpler to implement but it can make it more difficult to access previous nodes. Doubly-linked takes up double the space since we have 2x the pointers but easier to traverse backwards.
Operation | Average | Worst |
---|---|---|
Insert (T/H) | O(1) | O(1) |
Insert | O(n) | O(n) |
Remove | O(n) | O(n) |
Search | O(n) | O(n) |
Useful for undo functions, checking for matching braces, other syntax (or TMs), supports recursion behind the scenes, and is used in DFS on a graph.
Has 2 primary operations: push and pop. Last in, first out: what you most recently pushed will be what comes out when you pop.
Operation | Average | Worst |
---|---|---|
Push | O(1) | O(1) |
Pop | O(1) | O(1) |
Peek/Top | O(1) | O(1) |
Search | O(n) | O(n) |
Used to model a real-world queue like standing in line, a sequence of elements, web server manager for first come, first serve, or BFS graph traversal.
It's a linear data structure with has 2 main operations: dequeue ("polling") and enqueue ("offering"). You remove elements from the front and add elements to the back. Often done via singly-linked list since arrays (static) might not be big enough.
Operation | Average | Worst |
---|---|---|
Enqueue | O(1) | O(1) |
Dequeue | O(1) | O(1) |
Peek/Top | O(1) | O(1) |
Contains | O(n) | O(n) |
Remove | O(n) | O(n) |
Helpful for tracking item frequencies, if large files have equal contents (without opening files),
Provides a mapping from keys to values via hashing (called a "key-value" pair where keys are unique). Keys are immutable.
-
Open Addressing: Find another place within hash table by using an offset from original hash.
-
Separate Chaining: Use a separate data structure like a list to hold all different values (key-value pairs).
Operation | Average | Worst |
---|---|---|
Lookup | O(1) | O(n) |
Remove | O(1) | O(n) |
Insert | O(1) | O(n) |
- C: Procedural-oriented language; no references (just pointers), no function overloading, + memory management.
- Basic ex:
#include <stdio.h> int main() { printf(βHello World!β); return 0; }
- To Run:
gcc -o hi Helloworld.c
then runhi
- C++: Object-oriented language; references, pointers, function overloading + memory management.
- Basic ex:
#include <stdio.h> int main() { cout << "Hello World!" << endl; return 0; }
- To Run:
g++ -o hi Helloworld.c
then run./hi
- Tip: to avoid having to write "std:" constantly, use
using namespace std;
- Python: Object-oriented/scripting language; pointers, function overloading + automatic garbage collection.
- Basic ex:
def hello(): print("Hello World!") hello()
- To Run:
python Helloworld.c
- Tip: use Tensorflow/Keras if you need general ML models like regression,
PCA, Decision Trees, KNN, SVM, etc.
- To use these packages, treat them the same as any other import:
import tensorflow as tf
- To use these packages, treat them the same as any other import:
- Java: Object-oriented language; references, method overloading + automatic garbage collection.
- Basic ex:
public class HelloWorld { public static void main (String[] args) { System.out.println ("Hello World!"); } }
- To Run: compile with
javac Helloworld.java
then runjava Helloworld
- Tip: know the difference between abstact classes and interfaces
π INSERTION SORT
Small dataset and partially sorted.
Best | Average | Worst | Space |
---|---|---|---|
O(n) | O(n^2) | O(n^2) | O(1) |
π SELECTION SORT
Small dataset and partially sorted.
Best | Average | Worst | Space |
---|---|---|---|
O(n^2) | O(n^2) | O(n^2) | O(1) |
π MERGE SORT
Ideal for combining lists.
Best | Average | Worst | Space |
---|---|---|---|
O(nlogn) | O(nlogn) | O(nlogn) | O(n) |
π QUICK SORT
...
Best | Average | Worst | Space |
---|---|---|---|
O(nlogn) | O(nlogn) | O(n^2) | O(logn) |
π HEAP SORT
Can be chosen over quick sort because, in the case of a partially sorted array, it's worst case will always be O(nlogn) not O(n^2).
Best | Average | Worst | Space |
---|---|---|---|
O(n) | O(nlogn) | O(nlogn) | O(1) |
- Review major data structures
- Review your resume and be able to discuss all previous work experience/research/projects
- Review sorting algorithms
- Practice LeetCode/HackerRank
- Run through common behavioral questions
- Practice adding comments to your code like:
/**
* Insertion Sort
* Starting from left to right, select current number and if it's smaller than previous ones, keep moving it over to the left
*/
int* insertion_sort(int arr[]) {}
Start at a node, add its neighbors to queue, and visit their neighbors (add to queue).
We know if all nodes have been visited by marking them as visited (bool).
How would you make this more efficient? (general)
Is there a better data structure to use? (general)
Find the longest nonrepeating/even/odd/etc substring. (Google/Amazon)
Determine if the string is an anagram or palindrome. (Amazon)
Count all the leaf nodes. Count all the nodes in a level. Count all the nodes with one child. (Uber)
When you square a list of numbers, how would you resort them in ascending order? (Uber)