Master DSA
Practice arrays, trees, graphs, and DP problems. Solve 100+ problems on LeetCode/HackerRank focusing on medium and hard problems.
Zomato online assessment (OA) is the first round of Zomato’s placement process. This guide covers the Zomato online assessment format for both SDE and Product Analyst roles, question types, preparation strategy, and tips to clear the OA.
| Component | Details | Time Allocation |
|---|---|---|
| Platform | HackerRank or similar | - |
| Duration | 90-120 minutes | Total time |
| DSA Problems | 2-3 coding problems | 60-80 minutes |
| Debugging | 1-2 debugging questions | 20-30 minutes |
| Languages | Java, C++, Python, Go | - |
| Evaluation | All test cases must pass | - |
| Component | Details | Time Allocation |
|---|---|---|
| Platform | HackerRank or similar | - |
| Duration | 90-120 minutes | Total time |
| SQL Queries | 2-3 SQL problems | 30-40 minutes |
| Data Analysis | Case study questions | 30-40 minutes |
| Coding | Basic Python/SQL | 20-30 minutes |
| Evaluation | Correctness and logic | - |
This section draws on candidate discussions in r/PlacementsPrep, r/NSUT_Delhi, r/TechInterviewsIndia, r/leetcode and r/developersIndia from August to October 2026. We summarise patterns and do not copy anyone’s post. The reports are few, so treat them as signals rather than a confirmed pattern.
Zomato or Eternal? Zomato’s parent company is now called Eternal, and it also runs Blinkit and Hyperpure. Candidates use both names for the same hiring process, so an “Eternal Product Analyst OA” and a “Zomato Product Analyst OA” are the same thing in most threads.
The practical takeaway is to practise writing full queries without autocomplete, and to know exactly how many rows a LEFT JOIN produces.
These are original questions written to match the topics candidates reported. They are not leaked OA questions.
All SQL questions use this sample data:
restaurants
| restaurant_id | name | city |
|---|---|---|
| 1 | Biryani House | Delhi |
| 2 | Dosa Corner | Bengaluru |
| 3 | Momo Point | Delhi |
| 4 | Pizza Stop | Mumbai |
orders (user_id links to a users table that the questions do not need)
| order_id | user_id | restaurant_id | order_date | amount | status |
|---|---|---|---|---|---|
| 101 | 11 | 1 | 2026-09-01 | 450 | delivered |
| 102 | 12 | 1 | 2026-09-01 | 620 | delivered |
| 103 | 11 | 2 | 2026-09-02 | 300 | cancelled |
| 104 | 13 | 2 | 2026-09-03 | 350 | delivered |
| 105 | 12 | 2 | 2026-09-03 | 300 | delivered |
| 106 | 13 | 3 | 2026-09-04 | 180 | cancelled |
| 107 | 11 | 1 | 2026-09-05 | 620 | delivered |
1. SQL (window function): highest-value delivered order per restaurant
Return each restaurant’s highest-value delivered order. If two orders tie, return both.
Use RANK() so ties share rank 1. ROW_NUMBER() would keep only one of the tied orders, and which one it keeps is not guaranteed.
SELECT restaurant_id, order_id, amountFROM ( SELECT restaurant_id, order_id, amount, RANK() OVER (PARTITION BY restaurant_id ORDER BY amount DESC) AS rnk FROM orders WHERE status = 'delivered') tWHERE rnk = 1ORDER BY restaurant_id, order_id;| restaurant_id | order_id | amount |
|---|---|---|
| 1 | 102 | 620 |
| 1 | 107 | 620 |
| 2 | 104 | 350 |
Restaurants 3 and 4 have no delivered orders, so they do not appear.
2. SQL (joins and aggregation): delivered orders per restaurant, including zeros
(a) How many rows does restaurants r LEFT JOIN orders o ON r.restaurant_id = o.restaurant_id return?
(b) This query is meant to list every restaurant with its delivered-order count. What does it actually return, and how do you fix it?
SELECT r.name, COUNT(*) AS delivered_ordersFROM restaurants rLEFT JOIN orders o ON r.restaurant_id = o.restaurant_idWHERE o.status = 'delivered'GROUP BY r.restaurant_id, r.name;(a) 8 rows. Biryani House matches 3 orders, Dosa Corner 3, Momo Point 1, and Pizza Stop has no orders, so it appears once with NULLs.
(b) It returns only 2 rows: Biryani House 3 and Dosa Corner 2. The WHERE filter removes rows where o.status is NULL, which turns the LEFT JOIN into an inner join. Moving the filter into ON keeps all restaurants. You also need COUNT(o.order_id) instead of COUNT(*), because COUNT(*) counts the NULL row and would give 1 for restaurants with no delivered orders.
SELECT r.name, COUNT(o.order_id) AS delivered_orders, COALESCE(SUM(o.amount), 0) AS delivered_valueFROM restaurants rLEFT JOIN orders o ON r.restaurant_id = o.restaurant_id AND o.status = 'delivered'GROUP BY r.restaurant_id, r.nameORDER BY r.restaurant_id;| name | delivered_orders | delivered_value |
|---|---|---|
| Biryani House | 3 | 1690 |
| Dosa Corner | 2 | 650 |
| Momo Point | 0 | 0 |
| Pizza Stop | 0 | 0 |
3. Guesstimate: food delivery orders per day in Bengaluru
Estimate how many food delivery orders are placed in Bengaluru on a typical day, across all apps.
Every number below is an assumption chosen to be easy to defend. Interviewers grade the structure and the sanity check, not the final figure.
If asked for one app, apply a market-share assumption and say so. Also mention what would change the number, such as weekends, rain and festival days.
4. DSA (SDE): number of islands
Given a grid of 1s (land) and 0s (water), count the islands. Cells connect up, down, left and right, not diagonally. Example: [[1,1,0,0,0],[1,1,0,0,1],[0,0,1,0,1],[0,0,0,1,1]] → 3.
Scan every cell. When you find unvisited land, count a new island and flood-fill all land connected to it so it isn’t counted again. Each cell is visited once, so it is O(rows × cols) time and space. BFS with a queue avoids recursion-depth errors on large grids, which is a good point to raise when you explain it out loud.
from collections import deque
def num_islands(grid): if not grid: return 0 rows, cols = len(grid), len(grid[0]) seen = [[False] * cols for _ in range(rows)] count = 0 for r in range(rows): for c in range(cols): if grid[r][c] == 1 and not seen[r][c]: count += 1 seen[r][c] = True queue = deque([(r, c)]) while queue: x, y = queue.popleft() for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)): nx, ny = x + dx, y + dy if 0 <= nx < rows and 0 <= ny < cols and grid[nx][ny] == 1 and not seen[nx][ny]: seen[nx][ny] = True queue.append((nx, ny)) return countEdge cases to mention: an empty grid returns 0, and a checkerboard such as [[1,0,1],[0,1,0],[1,0,1]] returns 5 because diagonal cells are not connected.
Zomato online assessment questions for SDE focus on:
Zomato product analyst online assessment questions include:
Problem: Given delivery times for orders, find the minimum time to complete all deliveries with limited delivery agents.
Solution:
public int minDeliveryTime(int[] deliveryTimes, int agents) { Arrays.sort(deliveryTimes); int[] agentSchedule = new int[agents];
for (int time : deliveryTimes) { int minAgent = 0; for (int i = 1; i < agents; i++) { if (agentSchedule[i] < agentSchedule[minAgent]) { minAgent = i; } } agentSchedule[minAgent] += time; }
int maxTime = 0; for (int time : agentSchedule) { maxTime = Math.max(maxTime, time); }
return maxTime;}Time Complexity: O(n log n + n*k) where k is number of agents
Solution:
public int shortestDeliveryPath(int[][] graph, int start, int end) { int n = graph.length; int[] dist = new int[n]; Arrays.fill(dist, Integer.MAX_VALUE); dist[start] = 0;
PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[1] - b[1]); pq.offer(new int[]{start, 0});
while (!pq.isEmpty()) { int[] curr = pq.poll(); int node = curr[0], distance = curr[1];
if (node == end) return distance; if (distance > dist[node]) continue;
for (int i = 0; i < n; i++) { if (graph[node][i] > 0) { int newDist = distance + graph[node][i]; if (newDist < dist[i]) { dist[i] = newDist; pq.offer(new int[]{i, newDist}); } } } }
return -1; // No path found}Solution:
SELECT r.restaurant_id, r.restaurant_name, COUNT(o.order_id) AS order_countFROM restaurants rJOIN orders o ON r.restaurant_id = o.restaurant_idWHERE o.order_date >= DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)GROUP BY r.restaurant_id, r.restaurant_nameORDER BY order_count DESCLIMIT 5;Analysis Approach:
Key Metrics:
The Zomato Product Analyst OA (from student reports) is less “LeetCode hard” and more SQL + metrics + product sense. Expect a timed online set that mixes query writing, interpreting tables/charts, and short case prompts about food-delivery funnels.
| PA OA block | What shows up | Pass signal |
|---|---|---|
| SQL | Joins, GROUP BY, window functions, date filters |
Correct logic + readable query |
| Metrics | AOV, retention, conversion, delivery SLA | Define metric before computing |
| Case / product | Promo impact, restaurant ranking, ETA | Structured recommendation |
| Light Python/Excel (some drives) | Aggregate / clean a small table | Clean steps > fancy code |
Count users with ≥2 completed orders in the last 90 days.
SELECT COUNT(*) AS repeat_usersFROM (SELECT user_idFROM ordersWHERE status = 'completed'AND order_date >= CURRENT_DATE - INTERVAL '90' DAYGROUP BY user_idHAVING COUNT(*) >= 2) t;A ₹50 coupon on first orders lifts new users by 20% week-over-week, but average order value falls 8%. How would you decide if the promo should continue?
Approach: Estimate incremental margin = (incremental orders × contribution per order) − coupon cost − ops cost; check retention of coupon users in week 2-4; call out selection bias. PA OA rewards a clear framework over a single “yes/no.”
Organic search CTR for “biryani” dropped 15% in one city. List three hypotheses and one metric to validate each.
Sample hypotheses: ranking bug, competitor ads, supply gap in top restaurants. Metrics: impression share, add-to-cart rate, active restaurant count in that cuisine.
Master DSA
Practice arrays, trees, graphs, and DP problems. Solve 100+ problems on LeetCode/HackerRank focusing on medium and hard problems.
Food delivery domain
Study order matching algorithms, delivery optimization, and system design concepts relevant to food delivery platforms.
Practice OA questions
Solve Zomato OA previous year questions. Practice under time constraints and focus on optimal solutions.
Master SQL
Practice complex SQL queries including joins, aggregations, window functions, and subqueries. Solve 50+ SQL problems.
Data analysis
Practice interpreting data, calculating metrics, and analyzing trends. Study product metrics and A/B testing concepts.
Domain knowledge
Understand food delivery business model, order flow, delivery optimization, and customer behavior patterns.
DSA & coding practice
Recommended Channels:
Take U Forward - Complete DSA course, coding interview prep
Striver’s SDE Sheet - 180+ coding problems with video solutions
Aditya Verma - Dynamic programming masterclass
CodeWithHarry - Programming fundamentals
Search: “Zomato OA questions”, “online assessment preparation”, “coding interview practice”
Mock OA practice
YouTube Search:
“Zomato online assessment experience”
“Zomato OA questions 2025”
“How to clear Zomato coding round”
“Zomato HackerRank test”
Learn from candidates who cleared Zomato OA
Prepinsta
PrepInsta Resources:
Zomato OA mock tests
Previous year OA questions
Practice tests with solutions
Time management tips
Website: prepinsta.com/zomato
HackerRank
HackerRank Practice:
Coding challenges similar to Zomato OA
Practice problems by difficulty
Mock assessments
Time-bound practice
Website: hackerrank.com
LeetCode
LeetCode Practice:
2000+ coding problems
Company-tagged questions
Mock interviews
Weekly contests
Focus: Medium to hard problems for Zomato OA
Geeksforgeeks
GeeksforGeeks Resources:
Zomato OA experiences
Practice problems with solutions
Company-specific preparation
Interview preparation articles
Website: geeksforgeeks.org/zomato
Zomato Placement Papers
Practice with Zomato placement papers containing OA questions from previous years.
Zomato preparation guide
Complete preparation guide for Zomato placement including OA strategy.
Zomato coding questions
Practice Zomato coding questions with detailed solutions covering DSA and system design.