Status: 2.5 YoE, BS CS UC Davis Currently SDE II at ATT

Position: L3 Google Cloud

Location: Sunnyvale, CA

Date: May 20, 2019

Format:

Technical Phone Screen (45 Min)

- Given an array of integers A output if there exists a group of three integers i,j,k such that i > j > k and A[i] > A[j] > A[k].

Onsite (5 Rounds total 4 technincal):

- Technical R1 (45 Min)
- Buy sell stock 1 time
- Buy sell stock 1 time with indexs of best buy/sell
- Buy sell stock infinite times (can buy and sell in same day)
- Buy sell stock infinite times (can’t buy/sell same day)
- Buy sell stock up to 2 times
- Buy sell stock up to K times
- (this one was a bitch cause I had to solve these so fast)

- Techical R2 (45 Min)
- very similar to read4 II call multiple times
- You are given an api with read4098 that returns the next 4098 bytes of a file.
- Design a class with a read method that takes an int as a peramater and returns the next (n) bytes of file. Expect this to be called multiple times.
- Follow up: Add a seek method to the class that takes in an integer and seeks forward in the file if it is postive and backwards in the file if it is negative. You are given an additional api reset, which puts the api’s read pointer back at the front of the file.

- Technical R3 (45 Min)
- You are given a matrix of 0s and 1s, find the largest square of 1s
- Follow up: there exists a maximum of one square of minimum size sqrt(m) where m is the number of columns in the matrix

- Lunch “interview”
- Food was good, person I talked with wasn’t the best conversation partner, but that’s whatever

- Googlyness (45 Min)
- No real comments on this, apparently I was googly?

- Technical R4
- You are given an array of cells with positive points. Cells are described below
- Cell:
- Points: number of points in this cell
- getneighbors() -> list(cell)
- returns list of neighbor cells that are children of this cell

- spread(cell)->None:
- spreads from this cell to the inputted cell
- spreading is defined as moving all points from the current cell into a cell that has a value less than 1
- the result is the spreader has 1 point and the spreadee has (spreader + spreadee - 1) points

- Assume all the cells in the input array have a point value greater than 1
- Call spread starting at 1 cell and from each following cell that you are spreading to such that you fill in the most possible cells. (Note only start at 1 specific cell and spread from places that you spread to from this one)
- Followup: Call spread such that the resulting graph has the most posible positive valued cells

```
class Cell {
// number of points in this cell
int points;
// returns list of neighbor cells that are children of this cell
List<Cell> getNeighbors();
// spreads from this cell to the inputted cell
// spreading is defined as moving all points from the current cell into a cell that has a value less than 1
// the result is the spreader has 1 point and the spreadee has (spreader + spreadee - 1) points
// You can only spread to a heighboring cell
void spread(Cell cell);
}
```

I got optimal soultions on all problems except the last question’s followup (would love to see what people did for that). I did not finish the coding for the follow up of R2 due to the fact that my interviewer thoght I missed some edge cases and I had to take a lot of time explaining why my soultion worked. Overall, felt quite comfortable with these questions and feel like I did a good job.

I got the okay from HC and then team matched+exec review in about 2 weeks total.

Feel free to ask me any questions about my experience.

EPI is the book I used to prepare for this + Amazon.