Backend Engineer | Zenskar
JP Morgan Chase | SDE 3 | YOE 3.4
Microsoft SDE - 2 | Interview Experience | Status Pending
eBay || SWE3 Interview Experience || Bangalore
Bloomberg | Interview Experience | Senior Software Engineer | NYC | Nov 2025
Google Interview Question | May-2025
Summary
I recently went through a Google interview process which included a mock interview and three subsequent coding rounds. The problems covered various aspects of data structures and algorithms, ranging from array manipulation and graph cycle detection to log stream processing and graph reachability within specific time constraints.
Full Experience
My interview experience with Google started with a mock interview round. This was followed by three distinct coding rounds, each presenting its own set of challenges.
In the mock interview, the first question was a standard LeetCode problem about finding the shortest unsorted continuous subarray. The second question was more involved, asking to identify circular dependencies in an issue tracking system represented by a 2D boolean array of blockers.
The first coding round focused on designing a log stream processor. I needed to implement methods to register chat events and then efficiently determine the user with the most active conversations, where any message exchange between two unique users counted as a single conversation.
The second coding round presented a scenario where I had to deduplicate incoming messages based on a time window. The requirement was to show a message only if it hadn't been shown in the last 10 seconds.
Finally, the third coding round involved a graph problem. I was asked to design a class that, given a starting city in a map of one-way roads without cycles, could find all reachable cities from that starting point. The problem emphasized that the city names are unique and the scale could be large.
Interview Questions (5)
Imagine we are a software development company and we manage our dev process using an issue tracking tool. Each issue has an ID and also a list of IDs of issues which block it (Blockers or parents). As a result we have 1 or multiple unidirectional graphs because there could have several root issues. At some point in time someone added an issue A as a Blocker of issue B. But because A was already blocked by the descendants of the current issue B (descendants of B are the issues that are transitively blocked by B), this created a circular dependency. After this our UI issue tracking tool (Taskflow) stopped showing issues correctly. Our task is to find out all circular dependency loops. The input is a 2D boolean array of blockers assignments. The row number is the issue ID. The column number is Blocker issue ID. So entry (i, j) is True means that issue i is blocked by issue j.
Example input:
Where for (i,j)
(0,0)=False | (0,1)=False | (0,2)=True
(1,0)=True | (1,1)=False | (1,2)=False
(2,0)=False | (2,1)=True | (2,2)=False
The output is a list of dependency cycles. The order inside one cycle doesn't matter.
Example:
[
[0, 2, 1] (as well can be 2,1,0 or 1,0,2)
]
You're given a log stream of a chat application. Every log entry has the following fields: timestamp: long - the number of seconds that have elapsed since 1970-01-01. sender: str - username of the sender receiver: str - username of the receiver message_text: str - the message payload We want to implement a log stream processor which supports two methods: RegisterEvent(timestamp, sender_username, receiver_username, message_text) - registers the event that the message have been sent GetMostActiveUser() - Returns the user with the largest number of active conversations. We count any amount of messages exchanged between two unique users as a single conversation.
Examples:
RegisterEvent(0, "A", "B", "Hi!")
GetMostActiveUser() -> "A" or "B"
// Both users have a single conversation.
RegisterEvent(10, "A", "C", "Hi!")
RegisterEvent(15, "C", "A", "Hi, there!")
GetMostActiveUser() -> "A"
The problem involves processing a stream of messages with timestamps and only displaying them to the user if they haven't been shown in the last 10 seconds. Messages should be shown in their timestamp order, and within a 10-second window, duplicates should be suppressed.
Example Messages Received, with Timestamps:
10 solar panel activated
11 low battery warning
12 tire one: low air pressure
13 solar panel activated
14 low battery warning
21 solar panel activated
35 solar panel activated
Example Messages Shown to User:
10 solar panel activated
11 low battery warning
12 tire one: low air pressure
21 solar panel activated
35 solar panel activated
Given a map of cities and one-way roads (edges), where city names are unique and there are no cycles, the task is to design a class that, starting from a given city, can return all other cities reachable from it. The scale of cities and roads can be large.
Example:
cities = [a, b, c, d]
edges: [[a,b], [b,c], [a,d]] (example format)
input: "a"
output: [b, c, d]