parent
789add546f
commit
1311262d8a
@ -1,7 +1,6 @@
|
|||||||
Bit Manipulation
|
# Bit Manipulation
|
||||||
==
|
|
||||||
|
|
||||||
- How do you verify if an interger is a power of 2?
|
* 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 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 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.
|
* Write a program to determine the largest possible integer using the same number of 1 bits in a given number.
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
Geometry
|
# Geometry
|
||||||
==
|
|
||||||
|
|
||||||
- You have a plane with lots of rectangles on it, find out how many of them intersect.
|
* 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?
|
* 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.
|
* Given many points, find k points that are closest to the origin.
|
||||||
- How would you triangulate a polygon?
|
* How would you triangulate a polygon?
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
Graph
|
# Graph
|
||||||
==
|
|
||||||
|
|
||||||
- Given a list of sorted words from an alien dictionary, find the order of the alphabet.
|
* Given a list of sorted words from an alien dictionary, find the order of the alphabet.
|
||||||
- Alien Dictionary Topological Sort question.
|
* Alien Dictionary Topological Sort question.
|
||||||
- Find if a given string matches any path in a labeled graph. A path may contain cycles.
|
* 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.
|
* 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.
|
* 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.
|
* Given a graph and two nodes, determine if there exists a path between them.
|
||||||
- Determine if a cycle exists in the graph.
|
* Determine if a cycle exists in the graph.
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
Hash Table
|
# Hash Table
|
||||||
==
|
|
||||||
|
|
||||||
- Describe an implementation of a least-used cache, and big-O notation of it.
|
* 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.
|
* 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()`.
|
* 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/).
|
* [Source](http://blog.gainlo.co/index.php/2016/08/14/uber-interview-question-map-implementation/).
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
Heap
|
# Heap
|
||||||
==
|
|
||||||
|
|
||||||
- Merge `K` sorted lists together into a single list.
|
* 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.
|
* Given a stream of integers, write an efficient function that returns the median value of the integers.
|
||||||
|
@ -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.
|
* 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/)
|
* [Source](http://blog.gainlo.co/index.php/2016/06/12/flatten-a-linked-list/)
|
||||||
- Reverse a singly linked list. Implement it recursively and iteratively.
|
* Reverse a singly linked list. Implement it recursively and iteratively.
|
||||||
- Convert a binary tree to a doubly circular linked list.
|
* Convert a binary tree to a doubly circular linked list.
|
||||||
- Implement an LRU cache with O(1) runtime for all its operations.
|
* Implement an LRU cache with O(1) runtime for all its operations.
|
||||||
- Check distance between values in linked list.
|
* 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.
|
* 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.
|
* 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?
|
* How can you tell if a Linked List is a Palindrome?
|
||||||
|
@ -1,20 +1,19 @@
|
|||||||
Math
|
# Math
|
||||||
==
|
|
||||||
|
|
||||||
- Create a square root function.
|
* 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.
|
* 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").
|
* 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.
|
* Write a function that parses Roman numerals.
|
||||||
- E.g. `XIV` returns `14`.
|
* E.g. `XIV` returns `14`.
|
||||||
- Write in words for a given digit.
|
* Write in words for a given digit.
|
||||||
- E.g. `123` returns `one hundred and twenty three`.
|
* 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`.
|
* 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.
|
* Compute the square root of `N` without using any existing functions.
|
||||||
- Given numbers represented as binary strings, and return the string containing their sum.
|
* Given numbers represented as binary strings, and return the string containing their sum.
|
||||||
- E.g. `add('10010', '101')` returns `'10111'`.
|
* E.g. `add('10010', '101')` returns `'10111'`.
|
||||||
- Take in an integer and return its english word-format.
|
* Take in an integer and return its english word-format.
|
||||||
- E.g. 1 -> "one", -10,203 -> "negative ten thousand two hundred and three".
|
* 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.
|
* 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/)
|
* [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?
|
* 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/)
|
* [Source](http://blog.gainlo.co/index.php/2017/01/20/arrange-given-numbers-to-form-the-biggest-number-possible/)
|
||||||
|
@ -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.
|
* 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.
|
* 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,
|
* 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`.
|
* 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.
|
* 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).
|
* 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.
|
* 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.
|
* 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.
|
* 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).
|
* 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.
|
* 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.
|
* Check a 6 x 7 Connect 4 board for a winning condition.
|
||||||
- Given a fully-filled Sudoku board, check whether fulfills the Sudoku 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.
|
* 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.
|
* Given an N x N matrix of 1's and 0's, figure out if all of the 1's are connected.
|
||||||
|
@ -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 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?
|
* 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?
|
* 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?
|
* 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 implement an HR system to keep track of employee salaries and benefits?
|
||||||
|
@ -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.
|
* 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.
|
* Give all possible letter combinations from a phone number.
|
||||||
- Generate all subsets of a string.
|
* Generate all subsets of a string.
|
||||||
- Print all possible `N` pairs of balanced parentheses.
|
* Print all possible `N` pairs of balanced parentheses.
|
||||||
- E.g. when `N` is `2`, the function should print `(())` and `()()`.
|
* E.g. when `N` is `2`, the function should print `(())` and `()()`.
|
||||||
- E.g. when `N` is `3`, we should get `((()))`, `(()())`, `(())()`, `()(())`, `()()()`.
|
* E.g. when `N` is `3`, we should get `((()))`, `(()())`, `(())()`, `()(())`, `()()()`.
|
||||||
- [Source](http://blog.gainlo.co/index.php/2016/12/23/uber-interview-questions-permutations-parentheses/)
|
* [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.
|
* 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]]`.
|
* 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]]`.
|
||||||
|
@ -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 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 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).
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
Sorting and Searching
|
# Sorting and Searching
|
||||||
==
|
|
||||||
|
|
||||||
- Sorting search results on a page given a certain set of criteria.
|
* 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.
|
* 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 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).
|
* 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.
|
* Search for an element in a sorted and rotated array.
|
||||||
- [Source](http://blog.gainlo.co/index.php/2017/01/12/rotated-array-binary-search/)
|
* [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.
|
* 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.
|
* Search for an item in a sorted, but rotated, array.
|
||||||
- Merge two sorted lists together.
|
* Merge two sorted lists together.
|
||||||
- Give 3 distinct algorithms to find the K largest values in a list of N items.
|
* 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.
|
* 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.
|
* 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/)
|
* [Source](http://blog.gainlo.co/index.php/2017/01/20/arrange-given-numbers-to-form-the-biggest-number-possible/)
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
Stack
|
# Stack
|
||||||
==
|
|
||||||
|
|
||||||
- Implementation of an interpreter for a small language that does multiplication/addition/etc.
|
* 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.
|
* 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.
|
* 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.
|
* 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/)
|
* [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.
|
* Sort a stack in ascending order using an additional stack.
|
||||||
|
@ -1,58 +1,57 @@
|
|||||||
String
|
# String
|
||||||
==
|
|
||||||
|
|
||||||
- Output list of strings representing a page of hostings given a list of CSV strings.
|
* 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.
|
* 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.
|
* 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.
|
* 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.
|
* 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.
|
* 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`.
|
* 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))"`
|
* 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.
|
* 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. `"abba"` and `"redbluebluered"` should return `true`.
|
||||||
- E.g. `"aaaa"` and `"asdasdasdasd"` should return `true`.
|
* E.g. `"aaaa"` and `"asdasdasdasd"` should return `true`.
|
||||||
- E.g. `"aabb"` and `"xyzabcxzyabc"` should return `false`.
|
* 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.
|
* 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.
|
* 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.
|
* Design a spell-checking algorithm.
|
||||||
- Count and say problem.
|
* Count and say problem.
|
||||||
- Longest substring with `K` unique characters.
|
* Longest substring with `K` unique characters.
|
||||||
- [Source](http://blog.gainlo.co/index.php/2016/04/12/find-the-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.
|
* 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/)
|
* [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'`.
|
* 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/)
|
* [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.
|
* 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.
|
* 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*a'`, `'abbbbba'` => `true`.
|
||||||
- E.g. `'ab*b.'`, `'aba'` => `true`.
|
* E.g. `'ab*b.'`, `'aba'` => `true`.
|
||||||
- E.g. `'abc*'`, `'acccc'` => `false`.
|
* E.g. `'abc*'`, `'acccc'` => `false`.
|
||||||
- Given a rectangular grid with letters, search if some word is in the grid.
|
* 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'`.
|
* 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`.
|
* 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?
|
* 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.
|
* Print all permutations of a given string.
|
||||||
- Parse a string containing numbers and `'+'`, `'-'` and parentheses. Evaluate the expression. `-2+(3-5)` should return `-4`.
|
* 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.
|
* Output a substring with at most `K` unique characters.
|
||||||
- E.g. `'aabc'` and `k` = 2 => `'aab'`.
|
* 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.
|
* 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'`.
|
* E.g. `n = 2, string = 'ab-bcdecca'` => `'ab--bcdec--ca'`.
|
||||||
- Find the longest palindrome in a string.
|
* Find the longest palindrome in a string.
|
||||||
- Give the count and the number following in the series.
|
* Give the count and the number following in the series.
|
||||||
- E.g. `1122344`, next: `21221324`, next: `12112211121214`.
|
* E.g. `1122344`, next: `21221324`, next: `12112211121214`.
|
||||||
- Count and say problem.
|
* Count and say problem.
|
||||||
- Compress a string by grouping consecutive similar questions together:
|
* Compress a string by grouping consecutive similar questions together:
|
||||||
- E.g. `'aaabbbcc' => `'a3b3c2'`.
|
* 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.
|
* 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.
|
* Given a set of strings, return the smallest subset that contains prefixes for every string.
|
||||||
- E.g. `['foo', 'foog', 'food', 'asdf']` => `['foo', 'asdf']`.
|
* 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.
|
* 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.
|
* 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/)
|
* [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?
|
* 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/)
|
* [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.
|
* 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.
|
* 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'`.
|
* 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.
|
* Write a function that finds all the different ways you can split up a word into a concatenation of two other words.
|
||||||
|
@ -1,36 +1,35 @@
|
|||||||
Tree
|
# Tree
|
||||||
==
|
|
||||||
|
|
||||||
- Find the height of a tree.
|
* Find the height of a tree.
|
||||||
- Find the longest path from the root to leaf in a tree.
|
* Find the longest path from the root to leaf in a tree.
|
||||||
- Find the deepest left leaf of a tree.
|
* Find the deepest left leaf of a tree.
|
||||||
- Print all paths of a binary 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/)
|
* [Source](http://blog.gainlo.co/index.php/2016/04/15/print-all-paths-of-a-binary-tree/)
|
||||||
- Second largest element of a BST.
|
* Second largest element of a BST.
|
||||||
- [Source](http://blog.gainlo.co/index.php/2016/06/03/second-largest-element-of-a-binary-search-tree/)
|
* [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?
|
* 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/)
|
* [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.
|
* 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.
|
* 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?
|
* 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.
|
* 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.
|
* Compute the intersection of two binary search trees.
|
||||||
- Given a binary tree, output all the node to leaf paths of it.
|
* 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?
|
* 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.
|
* 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).
|
* 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.
|
* 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.
|
* Determine if a binary tree is a BST.
|
||||||
- Given a binary tree, serialize it into a string. Then deserialize it.
|
* Given a binary tree, serialize it into a string. Then deserialize it.
|
||||||
- Print a binary tree by column.
|
* Print a binary tree by column.
|
||||||
- Given a node, find the next element in a BST.
|
* 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.
|
* 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.
|
* Print out the sum of each row in a binary tree.
|
||||||
- Pretty print a JSON object.
|
* Pretty print a JSON object.
|
||||||
- Convert a binary tree to a doubly circular linked list.
|
* Convert a binary tree to a doubly circular linked list.
|
||||||
- Find the second largest number in a binary tree.
|
* Find the second largest number in a binary tree.
|
||||||
- Given a tree, find the longest branch.
|
* Given a tree, find the longest branch.
|
||||||
- Convert a tree to a linked list.
|
* Convert a tree to a linked list.
|
||||||
- Given two trees, write code to find out if tree A is a subtree of tree B.
|
* Given two trees, write code to find out if tree A is a subtree of tree B.
|
||||||
- Deepest node in a tree.
|
* Deepest node in a tree.
|
||||||
- [Source](http://blog.gainlo.co/index.php/2016/04/26/deepest-node-in-a-tree/)
|
* [Source](http://blog.gainlo.co/index.php/2016/04/26/deepest-node-in-a-tree/)
|
||||||
|
@ -1,94 +1,93 @@
|
|||||||
Design Questions
|
# Design Questions
|
||||||
==
|
|
||||||
|
|
||||||
## Guides
|
## Guides
|
||||||
|
|
||||||
- https://github.com/donnemartin/system-design-primer
|
* https://github.com/donnemartin/system-design-primer
|
||||||
- https://github.com/checkcheckzz/system-design-interview
|
* https://github.com/checkcheckzz/system-design-interview
|
||||||
- https://github.com/shashank88/system_design
|
* https://github.com/shashank88/system_design
|
||||||
- https://gist.github.com/vasanthk/485d1c25737e8e72759f
|
* https://gist.github.com/vasanthk/485d1c25737e8e72759f
|
||||||
- http://www.puncsky.com/blog/2016/02/14/crack-the-system-design-interview/
|
* 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/
|
* 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/
|
* http://blog.gainlo.co/index.php/2017/04/13/system-design-interviews-part-ii-complete-guide-google-interview-preparation/
|
||||||
|
|
||||||
## Flow
|
## Flow
|
||||||
|
|
||||||
#### A. Understand the problem and scope
|
#### A. Understand the problem and scope
|
||||||
|
|
||||||
- Define the use cases, with interviewer's help.
|
* Define the use cases, with interviewer's help.
|
||||||
- Suggest additional features.
|
* Suggest additional features.
|
||||||
- Remove items that interviewer deems out of scope.
|
* Remove items that interviewer deems out of scope.
|
||||||
- Assume high availability is required, add as a use case.
|
* Assume high availability is required, add as a use case.
|
||||||
|
|
||||||
#### B. Think about constraints
|
#### B. Think about constraints
|
||||||
|
|
||||||
- Ask how many requests per month.
|
* Ask how many requests per month.
|
||||||
- Ask how many requests per second (they may volunteer it or make you do the math).
|
* Ask how many requests per second (they may volunteer it or make you do the math).
|
||||||
- Estimate reads vs. writes percentage.
|
* Estimate reads vs. writes percentage.
|
||||||
- Keep 80/20 rule in mind when estimating.
|
* Keep 80/20 rule in mind when estimating.
|
||||||
- How much data written per second.
|
* How much data written per second.
|
||||||
- Total storage required over 5 years.
|
* Total storage required over 5 years.
|
||||||
- How much data reads per second.
|
* How much data reads per second.
|
||||||
|
|
||||||
#### C. Abstract design
|
#### C. Abstract design
|
||||||
|
|
||||||
- Layers (service, data, caching).
|
* Layers (service, data, caching).
|
||||||
- Infrastructure: load balancing, messaging.
|
* Infrastructure: load balancing, messaging.
|
||||||
- Rough overview of any key algorithm that drives the service.
|
* Rough overview of any key algorithm that drives the service.
|
||||||
- Consider bottlenecks and determine solutions.
|
* Consider bottlenecks and determine solutions.
|
||||||
|
|
||||||
Source: https://github.com/jwasham/coding-interview-university#system-design-scalability-data-handling
|
Source: https://github.com/jwasham/coding-interview-university#system-design-scalability-data-handling
|
||||||
|
|
||||||
## Grading Rubrics
|
## Grading Rubrics
|
||||||
|
|
||||||
- Problem Solving - How systematic is your approach to solving the problem step-by-step? Break down a problem into its core components.
|
* 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?
|
* 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?
|
* 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?
|
* Estimation - How fast does your system need to be? How much space does it need? How much load will it experience?
|
||||||
|
|
||||||
## Specific Topics
|
## Specific Topics
|
||||||
|
|
||||||
- URL Shortener
|
* URL Shortener
|
||||||
- http://stackoverflow.com/questions/742013/how-to-code-a-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/
|
* http://blog.gainlo.co/index.php/2016/03/08/system-design-interview-question-create-tinyurl-system/
|
||||||
- https://www.interviewcake.com/question/python/url-shortener
|
* https://www.interviewcake.com/question/python/url-shortener
|
||||||
- Collaborative Editor
|
* Collaborative Editor
|
||||||
- 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/
|
||||||
- Photo Sharing App
|
* Photo Sharing App
|
||||||
- http://blog.gainlo.co/index.php/2016/03/01/system-design-interview-question-create-a-photo-sharing-app/
|
* http://blog.gainlo.co/index.php/2016/03/01/system-design-interview-question-create-a-photo-sharing-app/
|
||||||
- Social Network Feed
|
* 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/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/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/
|
* http://blog.gainlo.co/index.php/2016/03/29/design-news-feed-system-part-1-system-design-interview-questions/
|
||||||
- Trending Algorithm
|
* Trending Algorithm
|
||||||
- http://blog.gainlo.co/index.php/2016/05/03/how-to-design-a-trending-algorithm-for-twitter/
|
* http://blog.gainlo.co/index.php/2016/05/03/how-to-design-a-trending-algorithm-for-twitter/
|
||||||
- Facebook Chat
|
* Facebook Chat
|
||||||
- http://blog.gainlo.co/index.php/2016/04/19/design-facebook-chat-function/
|
* http://blog.gainlo.co/index.php/2016/04/19/design-facebook-chat-function/
|
||||||
- Key Value Store
|
* 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/14/design-a-key-value-store-part-i/
|
||||||
- http://blog.gainlo.co/index.php/2016/06/21/design-key-value-store-part-ii/
|
* http://blog.gainlo.co/index.php/2016/06/21/design-key-value-store-part-ii/
|
||||||
- Recommendation System
|
* Recommendation System
|
||||||
- http://blog.gainlo.co/index.php/2016/05/24/design-a-recommendation-system/
|
* http://blog.gainlo.co/index.php/2016/05/24/design-a-recommendation-system/
|
||||||
- Cache System
|
* Cache System
|
||||||
- http://blog.gainlo.co/index.php/2016/05/17/design-a-cache-system/
|
* http://blog.gainlo.co/index.php/2016/05/17/design-a-cache-system/
|
||||||
- E-commerce Website
|
* E-commerce Website
|
||||||
- http://blog.gainlo.co/index.php/2016/08/22/design-ecommerce-website-part/
|
* 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/
|
* http://blog.gainlo.co/index.php/2016/08/28/design-ecommerce-website-part-ii/
|
||||||
- Web Crawler
|
* Web Crawler
|
||||||
- http://blog.gainlo.co/index.php/2016/06/29/build-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/
|
* 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
|
* https://www.quora.com/How-can-I-build-a-web-crawler-from-scratch/answer/Chris-Heller
|
||||||
- YouTube
|
* YouTube
|
||||||
- http://blog.gainlo.co/index.php/2016/10/22/design-youtube-part/
|
* 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/
|
* http://blog.gainlo.co/index.php/2016/11/04/design-youtube-part-ii/
|
||||||
- Hit Counter
|
* Hit Counter
|
||||||
- http://blog.gainlo.co/index.php/2016/09/12/dropbox-interview-design-hit-counter/
|
* http://blog.gainlo.co/index.php/2016/09/12/dropbox-interview-design-hit-counter/
|
||||||
- Facebook Graph Search
|
* Facebook Graph Search
|
||||||
- Design [Lyft Line](https://www.lyft.com/line).
|
* 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).
|
* Design a promo code system (with same promo code, randomly generated promo code, and promo code with conditions).
|
||||||
- Model a university.
|
* Model a university.
|
||||||
- How would you implement Pacman?
|
* How would you implement Pacman?
|
||||||
- Sketch out an implementation of Asteroids.
|
* Sketch out an implementation of Asteroids.
|
||||||
- Implement a spell checker.
|
* Implement a spell checker.
|
||||||
- Design the rubik cube.
|
* Design the rubik cube.
|
||||||
- Design a high-level interface to be used for card games (e.g. poker, blackjack etc).
|
* Design a high-level interface to be used for card games (e.g. poker, blackjack etc).
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
Search Engine
|
# Search Engine
|
||||||
==
|
|
||||||
|
|
||||||
###### References
|
###### 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/)
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
Databases
|
# Databases
|
||||||
==
|
|
||||||
|
|
||||||
## General
|
## General
|
||||||
|
|
||||||
- How should you store passwords in a database?
|
* How should you store passwords in a database?
|
||||||
- http://www.geeksforgeeks.org/store-password-database/
|
* http://www.geeksforgeeks.org/store-password-database/
|
||||||
- https://nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/
|
* https://nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/
|
||||||
|
@ -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).
|
* 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.
|
* Describe what happens when you enter a url in the web browser.
|
||||||
- Define UDP/TCP and give an example of both.
|
* Define UDP/TCP and give an example of both.
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,77 +1,25 @@
|
|||||||
Snake Game
|
# Snake Game
|
||||||
==
|
|
||||||
|
|
||||||
Design a snake game that is to be played in web browser.
|
Design a snake game that is to be played in web browser.
|
||||||
|
|
||||||
Client: React + Redux
|
Client: React + Redux
|
||||||
|
|
||||||
Rendering:
|
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.
|
||||||
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.
|
Fruit: One pixel. Snake body: One pixel width made up of connected pixels.
|
||||||
Snake body: One pixel width made up of connected pixels.
|
|
||||||
|
|
||||||
Model:
|
Model: { fruit: { x, y }, snake: { points: [(x, y), ...] # head is at index 0 direction: north/south/east/west } speed: 500, points: 0 }
|
||||||
{
|
|
||||||
fruit: {
|
|
||||||
x, y
|
|
||||||
},
|
|
||||||
snake: {
|
|
||||||
points: [(x, y), ...] # head is at index 0
|
|
||||||
direction: north/south/east/west
|
|
||||||
}
|
|
||||||
speed: 500,
|
|
||||||
points: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
function update() {
|
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];
|
||||||
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() {
|
function generate_fruit() { // Cannot generate on my own body.
|
||||||
// Cannot generate on my own body.
|
|
||||||
|
|
||||||
// First approach: while on body, generate
|
// 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
|
||||||
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
|
// 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 } } }
|
||||||
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
|
// 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); }
|
||||||
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);
|
setInterval(update, speed);
|
||||||
|
@ -1,22 +1,21 @@
|
|||||||
Software Engineering
|
# Software Engineering
|
||||||
==
|
|
||||||
|
|
||||||
## What is the difference between an interface and abstract class?
|
## What is the difference between an interface and abstract class?
|
||||||
|
|
||||||
**Abstract Class**
|
**Abstract Class**
|
||||||
|
|
||||||
- For an abstract class, a method must be declared as abstract. An abstract method doesn't have an implementation.
|
* 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.
|
* 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.
|
* 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.
|
* 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 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.
|
* Abstract class establishes "is a" relation with concrete classes.
|
||||||
|
|
||||||
**Interface**
|
**Interface**
|
||||||
|
|
||||||
- For an interface, all the methods are abstract by default. So one cannot declare variables or concrete methods in interfaces.
|
* 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.
|
* All methods declared in an interface must be public.
|
||||||
- Interfaces cannot contain variables and concrete methods except constants.
|
* Interfaces cannot contain variables and concrete methods except constants.
|
||||||
- A class can implement many interfaces. Hence multiple interface inheritance is possible.
|
* 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 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.
|
* Interface provides "has a" capability for classes.
|
||||||
|
@ -1,14 +1,13 @@
|
|||||||
Caching
|
# Caching
|
||||||
==
|
|
||||||
|
|
||||||
WIP.
|
WIP.
|
||||||
|
|
||||||
## Glossary
|
## Glossary
|
||||||
|
|
||||||
- **Cookies**
|
* **Cookies**
|
||||||
|
|
||||||
#### References
|
#### References
|
||||||
|
|
||||||
- [A Tale of Four Caches](https://calendar.perfplanet.com/2016/a-tale-of-four-caches/)
|
* [A Tale of Four Caches](https://calendar.perfplanet.com/2016/a-tale-of-four-caches/)
|
||||||
- [Web Caching Basics: Terminology, HTTP Headers, and Caching Strategies](https://www.digitalocean.com/community/tutorials/web-caching-basics-terminology-http-headers-and-caching-strategies)
|
* [Web Caching Basics: Terminology, HTTP Headers, and Caching Strategies](https://www.digitalocean.com/community/tutorials/web-caching-basics-terminology-http-headers-and-caching-strategies)
|
||||||
- [This browser tweak saved 60% of requests to Facebook](https://code.facebook.com/posts/557147474482256/this-browser-tweak-saved-60-of-requests-to-facebook/)
|
* [This browser tweak saved 60% of requests to Facebook](https://code.facebook.com/posts/557147474482256/this-browser-tweak-saved-60-of-requests-to-facebook/)
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
Design Questions
|
# Design Questions
|
||||||
==
|
|
||||||
|
|
||||||
## Autocomplete Widget
|
## Autocomplete Widget
|
||||||
|
|
||||||
Talk me through a full stack implementation of an autocomplete widget. A user can type text into it, and get back results from a server.
|
Talk me through a full stack implementation of an autocomplete widget. A user can type text into it, and get back results from a server.
|
||||||
- How would you design a frontend to support the following features:
|
|
||||||
- Fetch data from a backend API
|
* How would you design a frontend to support the following features:
|
||||||
- Render results as a tree (items can have parents/children - it's not just a flat list)
|
* Fetch data from a backend API
|
||||||
- Support for checkbox, radio button, icon, and regular list items - items come in many forms
|
* Render results as a tree (items can have parents/children - it's not just a flat list)
|
||||||
- What does the component's API look like?
|
* Support for checkbox, radio button, icon, and regular list items - items come in many forms
|
||||||
- What does the backend API look like?
|
* What does the component's API look like?
|
||||||
- What perf considerations are there for complete-as-you-type behavior? Are there any edge cases (for example, if the user types fast and the network is slow)?
|
* What does the backend API look like?
|
||||||
- How would you design the network stack and backend in support of fast performance: how do your client/server communicate? How is your data stored on the backend? How do these approaches scale to lots of data and lots of clients?
|
* What perf considerations are there for complete-as-you-type behavior? Are there any edge cases (for example, if the user types fast and the network is slow)?
|
||||||
|
* How would you design the network stack and backend in support of fast performance: how do your client/server communicate? How is your data stored on the backend? How do these approaches scale to lots of data and lots of clients?
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,11 +1,10 @@
|
|||||||
Networking
|
# Networking
|
||||||
==
|
|
||||||
|
|
||||||
WIP.
|
WIP.
|
||||||
|
|
||||||
## Glossary
|
## Glossary
|
||||||
|
|
||||||
- **JSON**
|
* **JSON**
|
||||||
- **RPC**
|
* **RPC**
|
||||||
- **HTTP**
|
* **HTTP**
|
||||||
- **HTTP/2**
|
* **HTTP/2**
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
Cover Letter
|
# Cover Letter
|
||||||
==
|
|
||||||
|
|
||||||
- A short introduction describing who you are and what you're looking for.
|
* A short introduction describing who you are and what you're looking for.
|
||||||
- What projects have you enjoyed working on?
|
* What projects have you enjoyed working on?
|
||||||
- Which have you disliked? What motivates you?
|
* Which have you disliked? What motivates you?
|
||||||
- Links to online profiles you use (GitHub, Twitter, etc).
|
* Links to online profiles you use (GitHub, Twitter, etc).
|
||||||
- A description of your work history (whether as a resume, LinkedIn profile, or prose).
|
* A description of your work history (whether as a resume, LinkedIn profile, or prose).
|
||||||
|
@ -1,27 +1,26 @@
|
|||||||
Psychological Tricks
|
# Psychological Tricks
|
||||||
==
|
|
||||||
|
|
||||||
Here are some psychological tricks that will help you ace a job interview.
|
Here are some psychological tricks that will help you ace a job interview.
|
||||||
|
|
||||||
- Tailor your answers to the interviewer's age.
|
* Tailor your answers to the interviewer's age.
|
||||||
- Generation Y interviewers (between 20 and 30): Bring along visual samples of your work and highlight your ability to multitask.
|
* Generation Y interviewers (between 20 and 30): Bring along visual samples of your work and highlight your ability to multitask.
|
||||||
- Generation X interviewers (between 30 and 50): Emphasize your creativity and mention how work/life balance contributes to your success.
|
* Generation X interviewers (between 30 and 50): Emphasize your creativity and mention how work/life balance contributes to your success.
|
||||||
- Baby Boomer interviewers (between 50 and 70): Show that you work hard and demonstrate respect for what they've achieved.
|
* Baby Boomer interviewers (between 50 and 70): Show that you work hard and demonstrate respect for what they've achieved.
|
||||||
- Hold your palms open or steeple your hands.
|
* Hold your palms open or steeple your hands.
|
||||||
- Find something in common with your interviewer.
|
* Find something in common with your interviewer.
|
||||||
- Mirror the interviewer's body language.
|
* Mirror the interviewer's body language.
|
||||||
- Compliment the interviewer and the organization without self-promoting.
|
* Compliment the interviewer and the organization without self-promoting.
|
||||||
- Specifically, the students who ingratiated themselves praised the organization and indicated their enthusiasm for working there, and complimented the interviewer. They didn't play up the value of positive events they took credit for or take credit for positive events even if they weren't solely responsible.
|
* Specifically, the students who ingratiated themselves praised the organization and indicated their enthusiasm for working there, and complimented the interviewer. They didn't play up the value of positive events they took credit for or take credit for positive events even if they weren't solely responsible.
|
||||||
- Show confidence and deference simultaneously.
|
* Show confidence and deference simultaneously.
|
||||||
- In a job interview, that means showing deference to your interviewer, while also demonstrating self-confidence. One way to do that is to say something like, "I love your work on [whatever area]. It reminds me of my work on [whatever area]."
|
* In a job interview, that means showing deference to your interviewer, while also demonstrating self-confidence. One way to do that is to say something like, "I love your work on [whatever area]. It reminds me of my work on [whatever area]."
|
||||||
- Emphasize how you took control of events in your previous jobs.
|
* Emphasize how you took control of events in your previous jobs.
|
||||||
- To impress your interviewer, you should talk about past work experiences where you took initiative.
|
* To impress your interviewer, you should talk about past work experiences where you took initiative.
|
||||||
- Be candid about your weaknesses.
|
* Be candid about your weaknesses.
|
||||||
- It's wiser to say something genuine like, "I'm not always the best at staying organized," which sounds more honest, and could make your interviewer more inclined to recommend you for the position.
|
* It's wiser to say something genuine like, "I'm not always the best at staying organized," which sounds more honest, and could make your interviewer more inclined to recommend you for the position.
|
||||||
- Speak expressively.
|
* Speak expressively.
|
||||||
- Showcase your potential.
|
* Showcase your potential.
|
||||||
- You might be tempted to tell your interviewer all about your past accomplishments — but research suggests you should focus more on what you could do in the future, if the organization hires you.
|
* You might be tempted to tell your interviewer all about your past accomplishments — but research suggests you should focus more on what you could do in the future, if the organization hires you.
|
||||||
|
|
||||||
###### References
|
###### References
|
||||||
|
|
||||||
- [Business Insider](http://www.businessinsider.com/psychological-tricks-to-ace-job-interview-2015-11)
|
* [Business Insider](http://www.businessinsider.com/psychological-tricks-to-ace-job-interview-2015-11)
|
||||||
|
@ -1,110 +1,109 @@
|
|||||||
Questions to Ask
|
# Questions to Ask
|
||||||
==
|
|
||||||
|
|
||||||
Here are some good questions to ask at the end of the interview, extracted from various sources. The ones in **bold** are the ones that tend to make the interviewer go "That's a good question" and pause and think for a bit.
|
Here are some good questions to ask at the end of the interview, extracted from various sources. The ones in **bold** are the ones that tend to make the interviewer go "That's a good question" and pause and think for a bit.
|
||||||
|
|
||||||
### General
|
### General
|
||||||
|
|
||||||
- **What are you most proud about in your career so far?**
|
* **What are you most proud about in your career so far?**
|
||||||
- **What is the most important/valuable thing you have learnt from working here?**
|
* **What is the most important/valuable thing you have learnt from working here?**
|
||||||
- How do your clients and customers define success?
|
* How do your clients and customers define success?
|
||||||
- What would you change around here if you could?
|
* What would you change around here if you could?
|
||||||
- What are some weaknesses of the organization?
|
* What are some weaknesses of the organization?
|
||||||
- What does a typical day look like for you?
|
* What does a typical day look like for you?
|
||||||
- What do you think the company can improve at?
|
* What do you think the company can improve at?
|
||||||
- How would you see yourself growing at this company in the next few years?
|
* How would you see yourself growing at this company in the next few years?
|
||||||
- Was there a time where you messed up and how was it handled?
|
* Was there a time where you messed up and how was it handled?
|
||||||
- Why did you choose to come to this company?
|
* Why did you choose to come to this company?
|
||||||
- When you were last interviewing, what were some of your other options, and what made you choose this company?
|
* When you were last interviewing, what were some of your other options, and what made you choose this company?
|
||||||
- What was something you wish someone would have told you before you joined?
|
* What was something you wish someone would have told you before you joined?
|
||||||
- What was your best moment so far at the company?
|
* What was your best moment so far at the company?
|
||||||
|
|
||||||
### Culture
|
### Culture
|
||||||
|
|
||||||
- **What is the most frustrating part about working here?**
|
* **What is the most frustrating part about working here?**
|
||||||
- **What is unique about working at this company that you have not experienced elsewhere?**
|
* **What is unique about working at this company that you have not experienced elsewhere?**
|
||||||
- **What is something you wish were different about your job?**
|
* **What is something you wish were different about your job?**
|
||||||
- How will the work I will be doing contribute to the organization's mission?
|
* How will the work I will be doing contribute to the organization's mission?
|
||||||
- What do you like about working here?
|
* What do you like about working here?
|
||||||
- What is your policy on working from home/remotely?
|
* What is your policy on working from home/remotely?
|
||||||
- (If the company is a startup) When was the last time you interacted with a founder? What was it regarding? Generally how involved are the founders in the day-to-day?
|
* (If the company is a startup) When was the last time you interacted with a founder? What was it regarding? Generally how involved are the founders in the day-to-day?
|
||||||
- Does the company culture encourage entrepreneurship? Could you give me any specific examples?
|
* Does the company culture encourage entrepreneurship? Could you give me any specific examples?
|
||||||
|
|
||||||
### Technical
|
### Technical
|
||||||
|
|
||||||
These questions are suitable for any technical role.
|
These questions are suitable for any technical role.
|
||||||
|
|
||||||
- **What are the engineering challenges that the company/team is facing?**
|
* **What are the engineering challenges that the company/team is facing?**
|
||||||
- **What has been the worst technical blunder that has happened in the recent past? How did you guys deal with it? What changes were implemented afterwards to make sure it didn't happen again?**
|
* **What has been the worst technical blunder that has happened in the recent past? How did you guys deal with it? What changes were implemented afterwards to make sure it didn't happen again?**
|
||||||
- **What is the most costly technical decision made early on that the company is living with now?**
|
* **What is the most costly technical decision made early on that the company is living with now?**
|
||||||
- **What is the most fulfilling/exciting/technically complex project that you've worked on here so far?**
|
* **What is the most fulfilling/exciting/technically complex project that you've worked on here so far?**
|
||||||
- How do you evaluate new technologies? Who makes the final decisions?
|
* How do you evaluate new technologies? Who makes the final decisions?
|
||||||
- How do you know what to work on each day?
|
* How do you know what to work on each day?
|
||||||
- How would you describe your engineering culture?
|
* How would you describe your engineering culture?
|
||||||
- How has your role changed since joining the company?
|
* How has your role changed since joining the company?
|
||||||
- What is your stack? What is the rationale for/story behind this specific stack?
|
* What is your stack? What is the rationale for/story behind this specific stack?
|
||||||
- Do you tend to roll your own solutions more often or rely on third party tools? What's the rationale in a specific case?
|
* Do you tend to roll your own solutions more often or rely on third party tools? What's the rationale in a specific case?
|
||||||
- How does the engineering team balance resources between feature requests and engineering maintenance?
|
* How does the engineering team balance resources between feature requests and engineering maintenance?
|
||||||
- What do you measure? What are your most important product metrics?
|
* What do you measure? What are your most important product metrics?
|
||||||
- What does the company do to nurture and train its employees?
|
* What does the company do to nurture and train its employees?
|
||||||
- How often have you moved teams? What made you join the team you're on right now? If you wanted to move teams, what would need to happen?
|
* How often have you moved teams? What made you join the team you're on right now? If you wanted to move teams, what would need to happen?
|
||||||
- If you hire person, what do you have for him to study product you're working on and processes in general? Do you have specifications, requirements, documentation?
|
* If you hire person, what do you have for him to study product you're working on and processes in general? Do you have specifications, requirements, documentation?
|
||||||
- There's "C++" (or Python, Swift or any other tech) in the job description. How will you estimate my proficiency in this tech in 3 months?
|
* There's "C++" (or Python, Swift or any other tech) in the job description. How will you estimate my proficiency in this tech in 3 months?
|
||||||
|
|
||||||
### Product
|
### Product
|
||||||
|
|
||||||
- Tell me about the main products of your company.
|
* Tell me about the main products of your company.
|
||||||
- What is the current version of product? (If it is v1.0 or similar - there could be a lot of chaos to work with)
|
* What is the current version of product? (If it is v1.0 or similar - there could be a lot of chaos to work with)
|
||||||
- What products are your main competitors?
|
* What products are your main competitors?
|
||||||
- What makes your product competitive?
|
* What makes your product competitive?
|
||||||
- When are you planning to provide the next release? (If in several months, it would mean a lot of requirements specified in job description are not needed right now)
|
* When are you planning to provide the next release? (If in several months, it would mean a lot of requirements specified in job description are not needed right now)
|
||||||
|
|
||||||
### Management
|
### Management
|
||||||
|
|
||||||
These questions are suitable for asking Engineering Managers, especially useful for the Team Matching phase of Google interviews or post-offer calls that your recruiters set up with the various team managers.
|
These questions are suitable for asking Engineering Managers, especially useful for the Team Matching phase of Google interviews or post-offer calls that your recruiters set up with the various team managers.
|
||||||
|
|
||||||
- **How do you train/ramp up engineers who are new to the team?**
|
* **How do you train/ramp up engineers who are new to the team?**
|
||||||
- **What does success look like for your team?**
|
* **What does success look like for your team?**
|
||||||
- **What qualities do you look out for when hiring for this role?**
|
* **What qualities do you look out for when hiring for this role?**
|
||||||
- **What are the strengths and weaknesses of the current team? What is being done to improve upon the weaknesses?**
|
* **What are the strengths and weaknesses of the current team? What is being done to improve upon the weaknesses?**
|
||||||
- **Can you tell me about a time you resolved an interpersonal conflict?**
|
* **Can you tell me about a time you resolved an interpersonal conflict?**
|
||||||
- How did you become a manager?
|
* How did you become a manager?
|
||||||
- How do your engineers know what to work on each day?
|
* How do your engineers know what to work on each day?
|
||||||
- What is your team's biggest challenge right now?
|
* What is your team's biggest challenge right now?
|
||||||
- How do you measure individual performance?
|
* How do you measure individual performance?
|
||||||
- How often are 1:1s conducted?
|
* How often are 1:1s conducted?
|
||||||
- What is the current team composition like?
|
* What is the current team composition like?
|
||||||
- What opportunities are available to switch roles? How does this work?
|
* What opportunities are available to switch roles? How does this work?
|
||||||
|
|
||||||
### Leadership
|
### Leadership
|
||||||
|
|
||||||
These questions are intended for senior level management, such as CEO, CTO, VPs. Candidates who interview with startups usually get to speak with senior level management.
|
These questions are intended for senior level management, such as CEO, CTO, VPs. Candidates who interview with startups usually get to speak with senior level management.
|
||||||
|
|
||||||
- How are you funded?
|
* How are you funded?
|
||||||
- Are you profitable? If no, what's your plan for becoming profitable?
|
* Are you profitable? If no, what's your plan for becoming profitable?
|
||||||
- What assurance do you have that this company will be successful?
|
* What assurance do you have that this company will be successful?
|
||||||
- Tell me about your reporting structure.
|
* Tell me about your reporting structure.
|
||||||
- How does the company decide on what to work on next?
|
* How does the company decide on what to work on next?
|
||||||
|
|
||||||
### HR
|
### HR
|
||||||
|
|
||||||
- **How do you see this position evolving in the next three years?**
|
* **How do you see this position evolving in the next three years?**
|
||||||
- **Who is your ideal candidate and how can I make myself more like them?**
|
* **Who is your ideal candidate and how can I make myself more like them?**
|
||||||
- What concerns/reservations do you have about me for this position?
|
* What concerns/reservations do you have about me for this position?
|
||||||
- What can I help to clarify that would make hiring me an easy decision?
|
* What can I help to clarify that would make hiring me an easy decision?
|
||||||
- How does the management team deal with mistakes?
|
* How does the management team deal with mistakes?
|
||||||
- If you could hire anyone to join your team, who would that be and why?
|
* If you could hire anyone to join your team, who would that be and why?
|
||||||
- How long does the average engineer stay at the company?
|
* How long does the average engineer stay at the company?
|
||||||
- Why have the last few people left?
|
* Why have the last few people left?
|
||||||
- Have you ever thought about leaving? If you were to leave, where would you go?
|
* Have you ever thought about leaving? If you were to leave, where would you go?
|
||||||
|
|
||||||
###### References
|
###### References
|
||||||
|
|
||||||
- [Business Insider](http://www.businessinsider.sg/impressive-job-interview-questions-2015-3/)
|
* [Business Insider](http://www.businessinsider.sg/impressive-job-interview-questions-2015-3/)
|
||||||
- [Lifehacker](http://lifehacker.com/ask-this-question-to-end-your-job-interview-on-a-good-n-1787624433)
|
* [Lifehacker](http://lifehacker.com/ask-this-question-to-end-your-job-interview-on-a-good-n-1787624433)
|
||||||
- [Fastcompany](https://www.fastcompany.com/40406730/7-questions-recruiters-at-amazon-spotify-and-more-want-you-to-ask)
|
* [Fastcompany](https://www.fastcompany.com/40406730/7-questions-recruiters-at-amazon-spotify-and-more-want-you-to-ask)
|
||||||
- [Questions I'm asking in interviews](http://jvns.ca/blog/2013/12/30/questions-im-asking-in-interviews/)
|
* [Questions I'm asking in interviews](http://jvns.ca/blog/2013/12/30/questions-im-asking-in-interviews/)
|
||||||
- [How to interview your interviewers](http://blog.alinelerner.com/how-to-interview-your-interviewers/)
|
* [How to interview your interviewers](http://blog.alinelerner.com/how-to-interview-your-interviewers/)
|
||||||
- [How to Break Into the Tech Industry—a Guide to Job Hunting and Tech Interviews](https://haseebq.com/how-to-break-into-tech-job-hunting-and-interviews/)
|
* [How to Break Into the Tech Industry—a Guide to Job Hunting and Tech Interviews](https://haseebq.com/how-to-break-into-tech-job-hunting-and-interviews/)
|
||||||
- [A developer's guide to interviewing](https://medium.freecodecamp.org/how-to-interview-as-a-developer-candidate-b666734f12dd)
|
* [A developer's guide to interviewing](https://medium.freecodecamp.org/how-to-interview-as-a-developer-candidate-b666734f12dd)
|
||||||
- [Questions I'm asking in interviews 2017](https://cternus.net/blog/2017/10/10/questions-i-m-asking-in-interviews-2017/)
|
* [Questions I'm asking in interviews 2017](https://cternus.net/blog/2017/10/10/questions-i-m-asking-in-interviews-2017/)
|
||||||
|
@ -1,27 +1,26 @@
|
|||||||
Self Introduction
|
# Self Introduction
|
||||||
==
|
|
||||||
|
|
||||||
You can rephrase the question like this:
|
You can rephrase the question like this:
|
||||||
|
|
||||||
"Tell me about your journey into tech. How did you get interested in coding, and why was web development a good fit for you? How is that applicable to our _____ role or company goals?"
|
"Tell me about your journey into tech. How did you get interested in coding, and why was web development a good fit for you? How is that applicable to our **\_** role or company goals?"
|
||||||
|
|
||||||
### The Elevator Pitch
|
### The Elevator Pitch
|
||||||
|
|
||||||
The Elevator Pitch is an indispensable tool for you as you move forward in your career. An Elevator Pitch is just that -- you pitch yourself to an executive that you want to impress and only have a short elevator ride to do so. Whether you're at a job fair with hundreds of other candidates and you have limited time or you are simply explaining who you are to a potential connection or client, it is important to be able to clearly and accurately describe your knowledge and skillset quickly and succinctly. Here are some tips to develop a good Elevator Pitch:
|
The Elevator Pitch is an indispensable tool for you as you move forward in your career. An Elevator Pitch is just that -- you pitch yourself to an executive that you want to impress and only have a short elevator ride to do so. Whether you're at a job fair with hundreds of other candidates and you have limited time or you are simply explaining who you are to a potential connection or client, it is important to be able to clearly and accurately describe your knowledge and skillset quickly and succinctly. Here are some tips to develop a good Elevator Pitch:
|
||||||
|
|
||||||
- Sell yourself
|
* Sell yourself
|
||||||
- The whole point of this is to get you a job or make a connection that benefits your career.
|
* The whole point of this is to get you a job or make a connection that benefits your career.
|
||||||
- Tell them who you are, who you work for (or school and major), and what you do.
|
* Tell them who you are, who you work for (or school and major), and what you do.
|
||||||
- KISS (Keep It Simple, Stupid)
|
* KISS (Keep It Simple, Stupid)
|
||||||
- Tell them some highlights from your favorite / most impressive projects.
|
* Tell them some highlights from your favorite / most impressive projects.
|
||||||
- Do not delve into the depths of how you reverse engineered a game and decrypted a packet to predict when to use your DKP on a drop. Tell them the executive summary: "I reverse engineered X game by decrypting Y packet to predict Z." If this catches their interest, they *will* ask further questions on their own.
|
* Do not delve into the depths of how you reverse engineered a game and decrypted a packet to predict when to use your DKP on a drop. Tell them the executive summary: "I reverse engineered X game by decrypting Y packet to predict Z." If this catches their interest, they _will_ ask further questions on their own.
|
||||||
- Why do *they* want *you*?
|
* Why do _they_ want _you_?
|
||||||
- This is where you use your knowledge of the company, knowledge of their technology stack(s), your unique talent that they want, etc. in order to solidify your ability to contribute to their company.
|
* This is where you use your knowledge of the company, knowledge of their technology stack(s), your unique talent that they want, etc. in order to solidify your ability to contribute to their company.
|
||||||
- PRACTICE!
|
* PRACTICE!
|
||||||
- Lastly, you must practice your pitch! Having a great, succinct summary of your skills only helps if you can actually deliver it rapidly! You should practice keeping a quick but easy-to-follow pace that won't overwhelm them but won't bore them. It's a precarious balance, but can be ironed out with practice.
|
* Lastly, you must practice your pitch! Having a great, succinct summary of your skills only helps if you can actually deliver it rapidly! You should practice keeping a quick but easy-to-follow pace that won't overwhelm them but won't bore them. It's a precarious balance, but can be ironed out with practice.
|
||||||
|
|
||||||
Having an Elevator Pitch on hand is a great way to create a network and happen upon new job opportunities. There will often be times when you can't prepare for an interview or meeting, and it is incredibly handy to have a practiced pitch.
|
Having an Elevator Pitch on hand is a great way to create a network and happen upon new job opportunities. There will often be times when you can't prepare for an interview or meeting, and it is incredibly handy to have a practiced pitch.
|
||||||
|
|
||||||
###### References
|
###### References
|
||||||
|
|
||||||
- [8 Secrets to Software Engineer Self Introduction](http://blog.gainlo.co/index.php/2016/10/14/8-secretes-software-engineer-self-introduction)
|
* [8 Secrets to Software Engineer Self Introduction](http://blog.gainlo.co/index.php/2016/10/14/8-secretes-software-engineer-self-introduction)
|
||||||
|
@ -1,37 +1,38 @@
|
|||||||
function deepEqual(val1, val2) {
|
function deepEqual(val1, val2) {
|
||||||
if (typeof val1 !== typeof val2) {
|
if (typeof val1 !== typeof val2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Array comparison.
|
||||||
|
if (Array.isArray(val1) && Array.isArray(val2)) {
|
||||||
|
if (val1.length !== val2.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (let i = 0; i < val1.length; i++) {
|
||||||
|
if (!deepEqual(val1[i], val2[i])) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Array comparison.
|
// Object comparison.
|
||||||
if (Array.isArray(val1) && Array.isArray(val2)) {
|
if (typeof val1 === 'object' && typeof val2 === 'object' && val1 !== null) {
|
||||||
if (val1.length !== val2.length) {
|
const keys1 = Object.keys(val1);
|
||||||
return false;
|
const keys2 = Object.keys(val2);
|
||||||
}
|
if (keys1.length !== keys2.length) {
|
||||||
for (let i = 0; i < val1.length; i++) {
|
return false;
|
||||||
if (!deepEqual(val1[i], val2[i])) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
for (let i = 0; i < keys1.length; i++) {
|
||||||
// Object comparison.
|
if (!deepEqual(val1[keys1[i]], val2[keys2[i]])) {
|
||||||
if (typeof val1 === 'object' && typeof val2 === 'object' && val1 !== null) {
|
return false;
|
||||||
const keys1 = Object.keys(val1), keys2 = Object.keys(val2);
|
}
|
||||||
if (keys1.length !== keys2.length) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for (let i = 0; i < keys1.length; i++) {
|
|
||||||
if (!deepEqual(val1[keys1[i]], val2[keys2[i]])) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Primitive comparison.
|
// Primitive comparison.
|
||||||
return val1 === val2;
|
return val1 === val2;
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = deepEqual;
|
module.exports = deepEqual;
|
||||||
|
@ -1,35 +1,35 @@
|
|||||||
function graphTopoSort(numberNodes, edges) {
|
function graphTopoSort(numberNodes, edges) {
|
||||||
const nodes = new Map();
|
const nodes = new Map();
|
||||||
const order = [];
|
const order = [];
|
||||||
const queue = [];
|
const queue = [];
|
||||||
for (let i = 0; i < numberNodes; i++) {
|
for (let i = 0; i < numberNodes; i++) {
|
||||||
nodes.set(i, { in: 0, out: new Set() });
|
nodes.set(i, {in: 0, out: new Set()});
|
||||||
}
|
}
|
||||||
|
|
||||||
edges.forEach(edge => {
|
edges.forEach(edge => {
|
||||||
const [node_id, pre_id] = edge;
|
const [node_id, pre_id] = edge;
|
||||||
nodes.get(node_id).in += 1;
|
nodes.get(node_id).in += 1;
|
||||||
nodes.get(pre_id).out.add(node_id);
|
nodes.get(pre_id).out.add(node_id);
|
||||||
});
|
});
|
||||||
|
|
||||||
for (let [node_id, value] of nodes.entries()) {
|
for (let [node_id, value] of nodes.entries()) {
|
||||||
if (value.in === 0) {
|
if (value.in === 0) {
|
||||||
queue.push(node_id);
|
queue.push(node_id);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (queue.length) {
|
while (queue.length) {
|
||||||
const node_id = queue.shift();
|
const node_id = queue.shift();
|
||||||
for (let outgoing_id of nodes.get(node_id).out) {
|
for (let outgoing_id of nodes.get(node_id).out) {
|
||||||
nodes.get(outgoing_id).in -= 1;
|
nodes.get(outgoing_id).in -= 1;
|
||||||
if (nodes.get(outgoing_id).in === 0) {
|
if (nodes.get(outgoing_id).in === 0) {
|
||||||
queue.push(outgoing_id);
|
queue.push(outgoing_id);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
order.push(node_id);
|
|
||||||
}
|
}
|
||||||
|
order.push(node_id);
|
||||||
|
}
|
||||||
|
|
||||||
return order.length == numberNodes ? order : [];
|
return order.length == numberNodes ? order : [];
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(graphTopoSort(3, [[0, 1], [0, 2]]));
|
console.log(graphTopoSort(3, [[0, 1], [0, 2]]));
|
||||||
|
@ -1,19 +1,21 @@
|
|||||||
// Does not handle negative numbers.
|
// Does not handle negative numbers.
|
||||||
function intToBin(number) {
|
function intToBin(number) {
|
||||||
if (number === 0) {
|
if (number === 0) {
|
||||||
return '0';
|
return '0';
|
||||||
}
|
}
|
||||||
let res = '';
|
let res = '';
|
||||||
while (number > 0) {
|
while (number > 0) {
|
||||||
res = String(number % 2) + res;
|
res = String(number % 2) + res;
|
||||||
number = parseInt(number / 2, 10);
|
number = parseInt(number / 2, 10);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(intToBin(0) === 0..toString(2) && 0..toString(2) === '0');
|
console.log(intToBin(0) === (0).toString(2) && (0).toString(2) === '0');
|
||||||
console.log(intToBin(1) === 1..toString(2) && 1..toString(2) === '1');
|
console.log(intToBin(1) === (1).toString(2) && (1).toString(2) === '1');
|
||||||
console.log(intToBin(2) === 2..toString(2) && 2..toString(2) === '10');
|
console.log(intToBin(2) === (2).toString(2) && (2).toString(2) === '10');
|
||||||
console.log(intToBin(3) === 3..toString(2) && 3..toString(2) === '11');
|
console.log(intToBin(3) === (3).toString(2) && (3).toString(2) === '11');
|
||||||
console.log(intToBin(5) === 5..toString(2) && 5..toString(2) === '101');
|
console.log(intToBin(5) === (5).toString(2) && (5).toString(2) === '101');
|
||||||
console.log(intToBin(99) === 99..toString(2) && 99..toString(2) === '1100011');
|
console.log(
|
||||||
|
intToBin(99) === (99).toString(2) && (99).toString(2) === '1100011',
|
||||||
|
);
|
||||||
|
@ -1,28 +1,30 @@
|
|||||||
function traverse(matrix) {
|
function traverse(matrix) {
|
||||||
const DIRECTIONS = [[0, 1], [0, -1], [1, 0], [-1, 0]];
|
const DIRECTIONS = [[0, 1], [0, -1], [1, 0], [-1, 0]];
|
||||||
const rows = matrix.length, cols = matrix[0].length;
|
const rows = matrix.length,
|
||||||
const visited = matrix.map(row => Array(row.length).fill(false));
|
cols = matrix[0].length;
|
||||||
function dfs(i, j) {
|
const visited = matrix.map(row => Array(row.length).fill(false));
|
||||||
if (visited[i][j]) {
|
function dfs(i, j) {
|
||||||
return;
|
if (visited[i][j]) {
|
||||||
}
|
return;
|
||||||
visited[i][j] = true;
|
|
||||||
DIRECTIONS.forEach(dir => {
|
|
||||||
const row = i + dir[0], col = j + dir[1];
|
|
||||||
// Boundary check.
|
|
||||||
if (row < 0 || row >= rows || col < 0 || col >= cols) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Valid neighbor check.
|
|
||||||
if (matrix[row][col] !== 1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
dfs(row, col);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
for (let i = 0; i < rows; i++) {
|
visited[i][j] = true;
|
||||||
for (let j = 0; j < cols; j++) {
|
DIRECTIONS.forEach(dir => {
|
||||||
dfs(i, j);
|
const row = i + dir[0],
|
||||||
}
|
col = j + dir[1];
|
||||||
|
// Boundary check.
|
||||||
|
if (row < 0 || row >= rows || col < 0 || col >= cols) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Valid neighbor check.
|
||||||
|
if (matrix[row][col] !== 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dfs(row, col);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
for (let i = 0; i < rows; i++) {
|
||||||
|
for (let j = 0; j < cols; j++) {
|
||||||
|
dfs(i, j);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,60 +1,62 @@
|
|||||||
function mergeSort(arr) {
|
function mergeSort(arr) {
|
||||||
if (arr.length < 2) {
|
if (arr.length < 2) {
|
||||||
// Arrays of length 0 or 1 are sorted by definition.
|
// Arrays of length 0 or 1 are sorted by definition.
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
const left = arr.slice(0, Math.floor(arr.length / 2));
|
const left = arr.slice(0, Math.floor(arr.length / 2));
|
||||||
const right = arr.slice(Math.floor(arr.length / 2), Math.floor(arr.length));
|
const right = arr.slice(Math.floor(arr.length / 2), Math.floor(arr.length));
|
||||||
|
|
||||||
return merge(mergeSort(left), mergeSort(right));
|
return merge(mergeSort(left), mergeSort(right));
|
||||||
}
|
}
|
||||||
|
|
||||||
function merge(arr1, arr2) {
|
function merge(arr1, arr2) {
|
||||||
const merged = [];
|
const merged = [];
|
||||||
let i = 0, j = 0;
|
let i = 0,
|
||||||
|
j = 0;
|
||||||
|
|
||||||
while (i < arr1.length && j < arr2.length) {
|
while (i < arr1.length && j < arr2.length) {
|
||||||
if (arr1[i] <= arr2[j]) {
|
if (arr1[i] <= arr2[j]) {
|
||||||
merged.push(arr1[i]);
|
merged.push(arr1[i]);
|
||||||
i++;
|
i++;
|
||||||
} else if (arr2[j] < arr1[i]) {
|
} else if (arr2[j] < arr1[i]) {
|
||||||
merged.push(arr2[j]);
|
merged.push(arr2[j]);
|
||||||
j++;
|
j++;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
merged.push(...arr1.slice(i), ...arr2.slice(j));
|
merged.push(...arr1.slice(i), ...arr2.slice(j));
|
||||||
return merged;
|
return merged;
|
||||||
}
|
}
|
||||||
|
|
||||||
const deepEqual = require('./deepEqual');
|
const deepEqual = require('./deepEqual');
|
||||||
|
|
||||||
console.log(deepEqual(
|
console.log(deepEqual(mergeSort([]), []));
|
||||||
mergeSort([]),
|
console.log(deepEqual(mergeSort([1]), [1]));
|
||||||
[],
|
console.log(deepEqual(mergeSort([2, 1]), [1, 2]));
|
||||||
));
|
console.log(deepEqual(mergeSort([7, 2, 4, 3, 1, 2]), [1, 2, 2, 3, 4, 7]));
|
||||||
console.log(deepEqual(
|
console.log(deepEqual(mergeSort([1, 2, 3, 4, 5, 0]), [0, 1, 2, 3, 4, 5]));
|
||||||
mergeSort([1]),
|
console.log(
|
||||||
[1],
|
deepEqual(mergeSort([10, 9, 8, 7, 6, 5, 4, 3, 2, 1]), [
|
||||||
));
|
1,
|
||||||
console.log(deepEqual(
|
2,
|
||||||
mergeSort([2, 1]),
|
3,
|
||||||
[1, 2],
|
4,
|
||||||
));
|
5,
|
||||||
console.log(deepEqual(
|
6,
|
||||||
mergeSort([7, 2, 4, 3, 1, 2]),
|
7,
|
||||||
[1, 2, 2, 3, 4, 7],
|
8,
|
||||||
));
|
9,
|
||||||
console.log(deepEqual(
|
10,
|
||||||
mergeSort([1, 2, 3, 4, 5, 0]),
|
]),
|
||||||
[0, 1, 2, 3, 4, 5],
|
);
|
||||||
));
|
console.log(
|
||||||
console.log(deepEqual(
|
deepEqual(mergeSort([98322, 3242, 876, -234, 34, 12331]), [
|
||||||
mergeSort([10, 9, 8, 7, 6, 5, 4, 3, 2, 1]),
|
-234,
|
||||||
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
|
34,
|
||||||
));
|
876,
|
||||||
console.log(deepEqual(
|
3242,
|
||||||
mergeSort([98322, 3242, 876, -234, 34, 12331]),
|
12331,
|
||||||
[-234, 34, 876, 3242, 12331, 98322],
|
98322,
|
||||||
));
|
]),
|
||||||
|
);
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
function treeEqual(node1, node2) {
|
function treeEqual(node1, node2) {
|
||||||
if (!node1 && !node2) {
|
if (!node1 && !node2) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!node1 || !node2) {
|
if (!node1 || !node2) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return node1.val == node2.val &&
|
return (
|
||||||
treeEqual(node1.left, node2.left) &&
|
node1.val == node2.val &&
|
||||||
treeEqual(node1.right, node2.right);
|
treeEqual(node1.left, node2.left) &&
|
||||||
|
treeEqual(node1.right, node2.right)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
function treeMirror(node) {
|
function treeMirror(node) {
|
||||||
if (!node) {
|
if (!node) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let temp = node.left;
|
let temp = node.left;
|
||||||
node.left = node.right;
|
node.left = node.right;
|
||||||
node.right = temp;
|
node.right = temp;
|
||||||
treeMirror(node.left);
|
treeMirror(node.left);
|
||||||
treeMirror(node.right);
|
treeMirror(node.right);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in new issue