Google | L4 | India | May 2025 [Offer]

google logo
google
India
May 17, 202513 reads

Summary

I successfully navigated a multi-round interview process with Google for an L4 position in India, culminating in a job offer. The process involved a phone screen, three onsite technical rounds, a Googlyness round, a hiring manager round, and team matching.

Full Experience

Timeline:

  • Early Feb: Recruiter reached out
  • Mid Feb: Phone Screening Round
  • Early April: All 3 technical onsite rounds
  • Late April: Googlyness Round
  • Early May: Hiring Manager Round
  • Mid May: Offer!

Interview Experience:

Phone Screening Round: Problem: https://leetcode.com/problems/separate-squares-i/description/. There was a big story around this problem but in essence it was the question I have linked above. I solved the problem without taking any hints but my implementation of binary search on decimal values was a bit messy. The interviewer asked me to spend more time refining it, which I did.

My thoughts: I hadn't seen this problem before the interview but found it afterward. I felt a bit slow and over-communicated at times, but the interviewer seemed satisfied with my approach. However, the interviewer was satisfied with my approach so I was hopeful.

Result: Recruiter called and said the feedback is positive but I could have done better time management. I believe the interviewer would have asked this problem as a follow up: https://leetcode.com/problems/separate-squares-ii/description/ but there was no time left. However, since the screening round only has Hire/No Hire verdicts, so mine would have been Hire.

Onsite Round 1: Problem: You are working on a data sequence but the data is too big. Fortunately the data has a lot of repeated values.So you would want use the run-length encoding (RLE) compression technique.

Input: 
2, 1, 1, 2, 5, 5, 3, 3
Output (RLE would look like):
2 ->1, 1 -> 2, 2 -> 1, 5 -> 2, 3 -> 2

Write a method to do this encoding.

Follow up 1: Given the encoded list and an index, return the value that was present at that index in the original list. Follow up 2: Assume the original list was sorted. You are given the encoded list of the original list and a value. You need to return the index of the first occurrence of this value in the original list.

My thoughts: The problem was initially vague, so I had to ask a lot of clarification questions. Once we narrowed it down to a list of integers, the implementation was straightforward. I was able to solve the follow ups as well with minimal changes in code for the original problem. I was feeling confident and was expecting a strong positive feedback.

Result: The recruiter's feedback was positive, but she did mention a couple of issues, specifically that my code focused only on one data type. This came as a surprise to me, but I guess the interviewer expected better clarification questions and better scoping from my end. My expectation of this round was Strong Hire but based on recruiter's feedback I think it would have been a Hire.

Onsite Round 2: Problem: https://leetcode.com/discuss/post/6551079/google-data-engineer-screening-round-by-7zhd9/.

The interviewer joined 5 minutes late and then proceeded to type out the question instead of pasting it. This easily wasted about 20 minutes. Luckily I had solved this question before and was able to come up with the solution very quickly. There was scope for optimization but they did not ask for it. Instead, with around 7-10 mins remaining they said they will ask language (cpp) specific questions. He wrote down these method signatures and asked me multiple questions around the same:

1. Node Merge(const Node& n1, const Node& n2) 
2. Node Merge(const Node n1, const Node n2) 
3. Node Merge(const Node* n1, const Node* n2) 
4. Node Merge(Node* n1,  Node* n2) 
5. Node Merge(Node& n1, Node& n2) 
6. Node Merge(Node&& n1, Node&& n2) 
7. Node Merge(Node n1, Node n2) 

My thoughts: Wasn't feeling particularly well after this round. Although I solved the coding problem very quickly, the unexpected language-specific questions made me very nervous. I would say I fumbled around 40 percent of the theoretical questions. I have gone over hundreds of interview experiences and never saw language-specific questions in a Google technical round. This was easily my worst round. I was hoping for a Lean Hire/Hire rating for this, only because I had solved the coding question quickly but was thinking it might be even Lean No Hire.

Result: The recruiter's call surprised me; she said the overall feedback was positive, despite a couple of concerns. Since she mentioned positive rather than mixed feedback (which is common for LH/LNH), I believe my rating was Hire. Thankfully, weightage was given to my performance in the coding question and not just the language specific questions.

Onsite Round 3:

Problems:

Q1: Design a class which will have these two methods:

AddEvent(int timestamp, int clientId) -> adds an request/event by this clientId at this timestamp
getCount()  -> this will return the number of distinct client requests in the last K seconds. K was also given upfront. 

You can assume you have a method which will give current time and you can use that in the getCount() method. 

Q2: There is a chess contest between N players. Each chess player has a distinct rank (positive integer number from 1 to N). We assume that in a chess game between two players, the higher ranked player always wins. Best player would have rank 1 and worst player would have rank N.

Rank1 => the player wins all other players. RankN => The player loses against all the players

Unfortunately, we don't know the player ranks. But we know the outcome of M games in the following format: Given the results of M games above, are there any players whose rank can be precisely determined? Return true is yes otherwise false.

Example:
N=5 M=5
The result of M games:  
Player #4 won #3 (read as player with id 4 won against player with id 3) 
Player #4 won #2
Player #3 won #2
Player #1 won #2
Player #2 won #5
Answer: True  

The rank of 2 players can be determined precisely:
player #2(rank is 4): they lost to players #1, #3, #4 and won against player #5;
player #5(rank is 5): they lost to player #2 and we know that player #2 has already lost to #1, #3, and #4.

My thoughts: Easily my best round, was able to solve both the questions but the round was anything but smooth. Throughout the round, I struggled to understand the interviewer's accent and primarily relied on what he wrote in the shared document. Thankfully, he too acknowledged the gap in communication and gave me an additional 30 minutes to complete the coding for the second question. I was expecting a Strong Hire/Hire rating for this round.

Result: The recruiter confirmed positive feedback with no concerns. The rating would have been SH.

Googlyness:

This round was taken by a very experienced Googler. Most of the questions felt standard and I was able to answer them well along with the follow up questions.

I mostly prepared from this list by a fellow leetcoder: https://leetcode.com/discuss/post/5963463/googlyness-frequently-asked-questions-by-55sh/. I prepared answers for all questions based on my experiences and used chatgpt to refine those answers. This round went smoothly, and I was expecting an H or SH.

Result: The recruiter confirmed it was a very good round for me, with positive feedback and no concerns. The rating would have been SH, and she informed me I would be moving to the team matching stage.

Team Matching Round:

A week later, a team matching round was scheduled. I researched about the team a bit, brushed up on my resume and revised my notes for Googlyness round as part of preparation for this round.

In the call, the EM mostly spoke about their team and asked a bunch of questions about their work and product. I showed genuine interest and I believe this is the most important thing in this round.

Result: Recruiter called and said it was a good match and that they will forward my packet to the Hiring Committee.

Final Result:

A week after the team matching feedback, the recruiter set up a call for compensation discussion. After a round of negotiation, I happily accepted the offer a day later!

Interview Questions (6)

Q1
Separate Squares I
Data Structures & Algorithms

Problem: https://leetcode.com/problems/separate-squares-i/description/. There was a big story around this problem but in essence it was the question I have linked above.

Q2
Run-Length Encoding and Decoding
Data Structures & Algorithms

You are working on a data sequence but the data is too big. Fortunately the data has a lot of repeated values.So you would want use the run-length encoding (RLE) compression technique.

Input: 
2, 1, 1, 2, 5, 5, 3, 3
Output (RLE would look like):
2 ->1, 1 -> 2, 2 -> 1, 5 -> 2, 3 -> 2

Write a method to do this encoding.

Follow up 1: Given the encoded list and an index, return the value that was present at that index in the original list. Follow up 2: Assume the original list was sorted. You are given the encoded list of the original list and a value. You need to return the index of the first occurrence of this value in the original list.

Q3
Problem from LeetCode Discuss Post
Data Structures & Algorithms

The interviewer joined 5 minutes late and then proceeded to type out the question instead of pasting it. This easily wasted about 20 minutes. Luckily I had solved this question before and was able to come up with the solution very quickly. There was scope for optimization but they did not ask for it.

Q4
C++ Node Merge Function Overloading/Signature Analysis
Other

Interviewer asked language (cpp) specific questions. He wrote down these method signatures and asked multiple questions around the same:

1. Node Merge(const Node& n1, const Node& n2) 
2. Node Merge(const Node n1, const Node n2) 
3. Node Merge(const Node* n1, const Node* n2) 
4. Node Merge(Node* n1,  Node* n2) 
5. Node Merge(Node& n1, Node& n2) 
6. Node Merge(Node&& n1, Node&& n2) 
7. Node Merge(Node n1, Node n2) 
Q5
Design Class for Distinct Client Events in Last K Seconds
Data Structures & Algorithms

Design a class which will have these two methods:

AddEvent(int timestamp, int clientId) -> adds an request/event by this clientId at this timestamp
getCount()  -> this will return the number of distinct client requests in the last K seconds. K was also given upfront. 

You can assume you have a method which will give current time and you can use that in the getCount() method. 
Q6
Determine Player Ranks in Chess Contest from M Games
Data Structures & Algorithms

There is a chess contest between N players. Each chess player has a distinct rank (positive integer number from 1 to N). We assume that in a chess game between two players, the higher ranked player always wins. Best player would have rank 1 and worst player would have rank N.

Rank1 => the player wins all other players. RankN => The player loses against all the players

Unfortunately, we don't know the player ranks. But we know the outcome of M games in the following format: Given the results of M games above, are there any players whose rank can be precisely determined? Return true is yes otherwise false.

Example:
N=5 M=5
The result of M games:  
Player #4 won #3 (read as player with id 4 won against player with id 3) 
Player #4 won #2
Player #3 won #2
Player #1 won #2
Player #2 won #5
Answer: True  

The rank of 2 players can be determined precisely:
player #2(rank is 4): they lost to players #1, #3, #4 and won against player #5;
player #5(rank is 5): they lost to player #2 and we know that player #2 has already lost to #1, #3, and #4.

Preparation Tips

Preparation:

I used to do leetcode in my college days. So when I started looking out for job switch, to revise all the concepts quickly I completed the Neetcode 150 list.

For google targeted preparation - I solved many problems from other Google interview experiences shared on Leetcode. When I say "I solved", I genuinely mean I implemented the running code locally for the problems which I thought had tricky implementation or had a concept which I was not too confident in. I believe this hands-on approach was one of the most important things that helped me a lot. Here's a small snapshot of my solutions folder to give you an idea:

Screenshot 2025-05-17 at 1.48.38 PM.png

Final thoughts:

The whole process took over 3 months and I learnt how to be really patient. At times, I felt like stopping Google-targeted preparation, as I had to spend significant time on LLD and system design preparation as well, which are asked in all other companies for mid-level roles. But I think my love for problem-solving kept me at it, and I made it a point to solve at least 2-3 google-kinda problems daily. Consistency and trust in the process pays off.

Thank you all for reading. Happy coding and good luck!

Discussion (0)

Share your thoughts and ask questions

Join the Discussion

Sign in with Google to share your thoughts and ask questions

No comments yet

Be the first to share your thoughts and start the discussion!