Google | L3 [Offer]
Round 1: Behavorial Round
How would you handle organizing a team building event for your team?
If you planned to ship a product and you did a big demo right before this shipment, but you find a crash hours before, how would you go about it?
Talk about one of the hardest challenges you've had in your life? Could be software related or not.
Round 2: System Design but more domain focused
I was given a chat application project, and was told to critic the design. I found several architectural design flaws, as well as applying MVVM solution to improve it. However, I was told to not use popular 3rd popular libraries such as RxJava or Retrofit. At this point, I suggested the solution Google themselves use in a library to solve some of the Android issues he was telling me to solve. I told him how I would implement it with the combination of MVVM. Even though I suggested the Google's way of resolution, he was pressing for an even better solution, and I couldn't exactly think of one, so we moved on to more design related issues and I was able to provide more brief general feedback & solutions.
He gave some less obvious examples to me at first, and with my fatigue I was stuck right off the bat and was approaching this like a word ladder problem which he quickly dismissed and said we don't necessarily need a tree at this point. He encouraged me to think of strings that wouldn't be possible to transform, which quickly triggered my thinking and made me realize a solution for this. Basically, order and character uniqueness matters. Ordinarily, I should've solved this pretty fast and got to the follow up, but due to whatever lack of momentum I had trouble developing I only got through this part, and not the follow up. By far my worst one, and I knew it. I'm happy to even getting the code up for the first part.
Given an N-ary tree, design an API such that the following operations are supported.
1. Add(Node a, Node b) add b to a
2. Delete(node) only leaves can be deleted
3. getLeft(Node) get left neighbor of node
4. getRight(node) get right neighbor of a node.
Many approaches to this, the approach I had for this was use a Node class to represent a node in the tree. One optimization to make the operations easier is to give this Node class a parent property. I solved getLeft/getRight with level order approach, there is a better solution to this, but that is as far as I got. Other edge cases include making sure child is not already a child of the parent for the add operation. Similarly making sure it makes sense to delete a child from a parent if it is the right owner. In general, interviewer seemed very collaborative with me on this one, and even delayed the next interviewer to see if I solve some edge cases. Not sure if that was a good or bad thing in terms of scoring, but yeah.
Given a person and a vehicle on a 2D grid, find the quickest way a person can get to the vehicle. No obstacles.
Standard BFS approach
Given multiple people on the grid and multiple vehicles, find the quickest way each person can get to each vehicle, and return a list of coordinates representing which person got which vehicle. Similar problem: https://leetcode.com/problems/campus-bikes/
Also BFS, but the queue data structure would queue every person first as well as some additional data to keep track of which person it is. Then we perform the BFS, and every iteration of the search, each person gets closer to their closest vehicles. Once a vehicle is reached we mark it as used to avoid 2 persons using 1 vehicle. Opted to use a map for the visited structure as opposted to a Set used for part 1, so no one person revisits the same cell twice. We can ID each person before the BFS first so the visited structure knows which cells to update for which person. Definitely some optimizations to the approach, but each of these interviews was 30 minutes, so I aimed to provide optimal approaches with verbose coding, and could fix if time let me. Interviewer was odd for this one, he spent a lot of time observing my approach for the first part which I did fast since it was standard BFS. Afterwards, I only had about 10-15 minutes to solve the next, harder one.
I was aiming for L4, but got approved for L3 instead. I was told by some sources it may be due to a lack of FAANG companies on my resume, although others did mention throughout the process it was weaker scores 2 out of the 5. Although in my head I thought I did poor for 1 out of 5, since I really wasn't at my best for Round 3 specifically. But you can never judge yourself, because they are trained to make you feel good about the overall experience.
Tips and advice
Here was my routine, and I plan to do next time I put myself through this.
Pomodoro technique - Solve easy/medium/hard problems in 25-35 minutes of deep focus, 5-10 minute breaks. Breaks are critical, otherwise torturing your head will burn you out in days. Whereas, give yourself breaks, will have you sustaining this routine for weeks, with less chances of burning out. Solved 185 LC problems, breakdown is 75 easy - 96 medium - 14 hard.
Leetcode premium explore tab. Recursion, trees, arrays and strings, and doing the company cards like FB, Amazon, Google, etc.
The Discussion tab for leetcode solutions that I did not understand the optimal approach for. I was once at a level where I could not reach optimal solutions on the first try, not even close. With time and practice and deep dives into the discussion tab, I've learned and became more eager to apply optimal approaches and technique for problems.
Solutions tab, although I didn't use this as frequently as I did the discussions, it was helpful at times. But discussion section was definitely better.
Cracking the coding interview solution sections, didn't use as much but was helpful.
Hidden programming book gem I found that I see no one talks about as much as cracking the coding interview is Elements of Programming Interview. The book takes a problem-first approach which naturally takes a tehcnique-first approach as well, rather than more theory based.
Train your mind to stay solution-focused, not problem-focus - tech companies want solution-focused candidates. Regardless of the difficulty of the problem, keep attacking it with your knowledge and push your limits until you solve it or at least can develop a reasonable direction. This means do not evade challenges and remain solution focused, even when you fail (even when you fail interviews). This is hard as most people will handle failure with negative thoughts, but these tech comapnies don't want most people.
Communication. Talk out loud to yourself as you solve the problem, even if your talking to yourself and sound crazy. Talk through all the bad, ridiculous, good, very good, optimal paths to yourself. The more level of detail you can explain to yourself out loud, the better. But it has to be out oud, and not detailed conversations hidden in your head.
Last but not least - and this part is kind of personal so feel free to skip this. You may have seen this said elsewhere, but do not make comparisons to others. But I would like to add more. Everyone has their own journey, I'm talking about day 1 on earth to this point in your life. I know an L3 Google offer isn't a big deal to some very smart people here. But to me, even this was never suppose to be on the roadmap for someone like me. At the age of 14/15, I was practically an aspiring gangster in the streets of LA, and figured I'd be in the NBA (no I'm not black/mexican, neither am I over 6 ft, just another brownie with ambition in the opposite direction). Things shifted in my life, I got into coding through the help of my parents and ultimately developed a knack for it. I was good at my not so popular university, and even at that point just due to the reputation of the school this still wasn't expected. But I was determined, and saw what it took, and as discouraged as I was in the beginning (struggling w/ easy problems on LC), dedication and perserverance brought me to the level I'm at today. And I hope to keep growing and learning!