← Majid Al Futtaim Interview Insights

Majid Al Futtaim·Software Engineer·Onsite - Multi Round·Intermediate

IntermediateRejected
Jul 2026Gurugram

Summary

Went through a two-day interview process at Majid Al Futtaim for an SDE role, covering an online assessment, an AI-proctored explanation round, and two on-site technical interviews. Made it all the way to the Tech Lead final round before getting rejected, which stung but wasn't a surprise in hindsight given where my system design gaps were.

Questions Asked (10)

Q1

Solve the Asteroid Collision problem.

Algorithms & Data Structures
Author's notes

Part of the OA batch so no real discussion happened here, just coded it up and moved on.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Use a stack to simulate asteroid collisions: iterate through the array, and for each asteroid, resolve collisions with the top of the stack until a stable state is reached. Only right-moving asteroids (positive) can collide with left-moving ones (negative) that come after them, so the stack naturally handles the order.

Pro tip: Clarify the collision rules upfront (same direction never collide, equal size annihilate both) and mention edge cases like empty input or all asteroids moving the same direction. This shows attention to detail and prevents misunderstandings.

1. Understand the problem and clarify rules

Restate the collision rules: asteroids move in their direction, collisions occur only when a right-moving asteroid meets a left-moving one, and equal sizes destroy both. Confirm with the interviewer if needed.

2. Choose the right data structure

Recognize that a stack is ideal because collisions happen between the most recent surviving asteroid and the current one, following a last-in-first-out order.

3. Iterate and resolve collisions

For each asteroid, while the stack is not empty and the top is positive and the current is negative, compare absolute sizes. Pop the top if it's smaller, skip the current if it's smaller, or pop and skip if equal.

4. Push surviving asteroids

After resolving all possible collisions, push the current asteroid onto the stack if it hasn't been destroyed.

5. Return the final state

Convert the stack to an array and return it as the result, ensuring the order is preserved.

Key Points to Mention

  • Stack-based simulation for O(n) time complexity
  • Collision conditions: only when top > 0 and current < 0
  • Handling of equal sizes: both asteroids destroyed
  • Edge cases: empty input, all positive, all negative, alternating directions
  • Space complexity O(n) for the stack
  • Comparison of absolute values to determine which asteroid survives

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q2

Solve the House Robber III problem (tree DP variant).

Algorithms & Data Structures
Author's notes

This one's the tree version where you can't rob adjacent nodes.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Use a post-order DFS that returns two values per node: the maximum loot if the node is robbed and if it is not. Combine child results bottom-up: if robbed, add the 'not robbed' values of children; if not robbed, take the max of each child's two states. Return the max of the root's two states.

Pro tip: Explicitly state the recurrence and its O(n) time/O(h) space complexity, then mention that a naive top-down memoization on (node, parentRobbed) also works but the two-value return is cleaner and avoids a hash map.

1. Clarify the problem and constraints

Restate the rules: cannot rob a node and its direct child; maximize total money. Ask about tree size, value ranges, and whether the tree can be empty or skewed.

2. Define the DP state

For each node, define two values: rob[node] = max money if this node is robbed; skip[node] = max money if this node is not robbed.

3. Derive the recurrence

rob[node] = node.val + skip[left] + skip[right]; skip[node] = max(rob[left], skip[left]) + max(rob[right], skip[right]).

4. Implement post-order DFS

Recursively compute the pair for left and right subtrees, then combine at the current node. Return the pair up the call stack.

5. Return and analyze

At the root, return max(rob[root], skip[root]). State time complexity O(n) and space complexity O(h) for recursion stack.

Key Points to Mention

  • Tree DP with two states per node (robbed vs not robbed)
  • Post-order traversal to process children before parent
  • Recurrence: rob = val + skip(left) + skip(right); skip = max(rob, skip) for each child
  • Time complexity O(n) and space complexity O(h) where h is tree height
  • Handling edge cases: empty tree, single node, skewed tree
  • Alternative: memoized DFS with state (node, parentRobbed) but two-value return is more efficient

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q3

How many valid BST subtrees exist in a given binary tree?

Algorithms & Data Structures
Author's notes

Trickiest of the three OA problems for me.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Clarify the definition of a valid BST subtree, then propose a post-order traversal that returns for each node whether its subtree is a BST, along with the min and max values and the count of valid BST subtrees. Use this information to count valid BST subtrees in O(n) time and O(h) space.

Pro tip: Mention that a single node is always a valid BST, and that you can avoid extra space by returning a tuple (isBST, min, max, count) from the recursive function. Also, discuss how to handle duplicate values if the BST definition allows them.

1. Clarify the problem

Ask whether a valid BST subtree means every node in the subtree satisfies the BST property relative to the subtree's root, and whether duplicate values are allowed. Confirm that a single node counts as a valid BST.

2. Choose traversal and data to return

Use post-order traversal because subtree information is needed before processing the parent. For each node, return whether its subtree is a BST, the minimum and maximum values in that subtree, and the number of valid BST subtrees within it.

3. Define base case and combine logic

For a null node, return (true, +inf, -inf, 0). For a leaf, return (true, node.val, node.val, 1). For an internal node, combine left and right results: the subtree is a BST if both children are BSTs and left.max < node.val < right.min; then update min/max and add 1 to the count if valid.

4. Implement and count

Recursively compute the tuple for each node, incrementing a global counter or returning the count. At the end, the count at the root is the total number of valid BST subtrees.

5. Analyze complexity and edge cases

State that the algorithm runs in O(n) time and O(h) space due to recursion. Discuss edge cases: empty tree, single node, all nodes forming a BST, and trees with duplicate values if allowed.

Key Points to Mention

  • Definition of a valid BST subtree: every node in the subtree must satisfy the BST property relative to the subtree's root.
  • Post-order traversal is ideal because it processes children before the parent.
  • Returning a tuple (isBST, min, max, count) from each recursive call avoids global variables and extra passes.
  • A single node is always a valid BST, so the count for a leaf is 1.
  • Time complexity O(n) and space complexity O(h) for recursion stack.
  • Handling of duplicate values if the BST definition permits them (e.g., left <= root < right or similar).

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q4

Walk through and explain your solution to one of the OA problems in an AI-moderated interview.

Algorithms & Data Structures
Author's notes

Weird format.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Select a problem you solved confidently during the OA, then narrate your solution in a clear, structured way: restate the problem, explain your initial thoughts, describe the algorithm, analyze complexity, and mention any edge cases. Since it's AI-moderated, speak as if explaining to a human interviewer—be concise but thorough, and avoid dead air.

Pro tip: Choose a problem where you can clearly articulate the trade-offs between your initial approach and the optimal solution, as this demonstrates deeper understanding and problem-solving maturity. Also, explicitly state your assumptions and constraints before diving into the solution to show you think before coding.

1. Restate the problem and clarify constraints

Briefly summarize the problem in your own words, including input/output format, constraints, and any assumptions. This ensures you and the interviewer (or AI) are aligned.

2. Discuss initial thoughts and brute-force approach

Explain a naive or brute-force solution first, including its time and space complexity. This shows you can start simple and then optimize.

3. Present the optimized algorithm

Describe your improved approach step-by-step, focusing on the key insight or data structure used. Walk through a small example to illustrate.

4. Analyze complexity and edge cases

State the time and space complexity of your final solution, and mention any edge cases you considered (e.g., empty input, large values, duplicates).

5. Conclude with testing and potential improvements

Briefly explain how you would test the solution, and mention any further optimizations or alternative approaches if relevant.

Key Points to Mention

  • Problem understanding: restate the problem and clarify constraints
  • Brute-force vs optimized approach: explain why you moved from one to the other
  • Data structures and algorithms used: name them and justify their choice
  • Time and space complexity: provide Big-O analysis for both approaches
  • Edge cases: mention specific examples you handled
  • Testing strategy: how you would verify correctness with sample inputs

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q5

Solve a dynamic programming problem under timed conditions (on-site OA).

Algorithms & Data Structures
Author's notes

No specific problem name I can share but it was a classic DP setup.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

First, restate the problem in your own words and clarify constraints and edge cases. Then, identify the optimal substructure and overlapping subproblems, define the DP state and recurrence, and implement iteratively with careful indexing. Finally, test with small examples and analyze time and space complexity.

Pro tip: In timed OAs, start with a brute-force recursive solution to validate correctness, then optimize using memoization or tabulation. Always write down the DP table dimensions and base cases before coding to avoid off-by-one errors.

1. Understand and Clarify

Restate the problem, ask clarifying questions about input size, constraints, and expected output. Identify if it's a classic DP pattern (e.g., knapsack, LCS, coin change).

2. Define State and Recurrence

Determine what each DP state represents (e.g., dp[i] = max value up to index i). Write the recurrence relation and base cases clearly.

3. Choose Implementation Strategy

Decide between top-down memoization (easier to derive) and bottom-up tabulation (often more efficient). Consider space optimization if possible.

4. Code and Test

Implement the solution with clear variable names and comments. Test with provided examples, edge cases (empty input, large values), and trace through small inputs.

5. Analyze Complexity

State the time and space complexity of your solution. Discuss potential optimizations or trade-offs.

Key Points to Mention

  • Optimal substructure and overlapping subproblems as DP prerequisites
  • State definition and recurrence relation with base cases
  • Time and space complexity analysis (e.g., O(n^2) time, O(n) space)
  • Edge cases: empty input, single element, negative numbers, large constraints
  • Space optimization techniques (e.g., rolling array, two variables)
  • Testing strategy: brute-force comparison for small inputs

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q6

Solve a linked list or graph traversal problem under timed conditions (on-site OA).

Algorithms & Data Structures
Author's notes

Came paired with the DP question.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

First, clarify the problem constraints and edge cases, then choose the appropriate traversal algorithm (BFS/DFS for graphs, iterative/recursive for linked lists). Implement a clean solution with optimal time and space complexity, and test with small examples before finalizing.

Pro tip: In timed OAs, prioritize writing a working brute-force solution first, then optimize if time permits; this ensures partial credit and reduces panic.

1. Understand and Clarify

Restate the problem in your own words and ask clarifying questions about input size, edge cases, and expected output format.

2. Plan the Approach

Identify if it's a linked list or graph problem, and select the optimal algorithm (e.g., two pointers, BFS, DFS) based on constraints.

3. Implement Efficiently

Write clean, modular code with meaningful variable names, handling edge cases like empty lists or cycles.

4. Test with Examples

Walk through your code with a small test case, including edge cases, to verify correctness and catch off-by-one errors.

5. Analyze Complexity

State the time and space complexity of your solution and discuss potential optimizations if needed.

Key Points to Mention

  • Time and space complexity analysis (Big O notation)
  • Edge cases: empty list, single node, cycles, disconnected graphs
  • Choice of data structures (e.g., hash set for cycle detection, queue for BFS)
  • Trade-offs between iterative and recursive approaches
  • Use of two-pointer technique for linked list problems
  • Importance of writing clean, readable code under time pressure

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q7

Multiple choice questions covering system design concepts, design patterns, OOP principles, and computer networks.

System DesignTechnical Trade-offs
Author's notes

Seven MCQs as part of the on-site OA.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Read each question carefully, eliminate obviously wrong options, and select the best answer based on fundamental principles. For conceptual questions, recall standard definitions and best practices; for trade-off questions, consider scalability, maintainability, and performance.

Pro tip: Don't overthink; often the simplest, most standard answer is correct. If unsure, choose the option that aligns with widely accepted best practices and avoids over-engineering.

1. Read and Understand

Read the question and all options thoroughly to grasp what is being asked. Identify key terms and concepts.

2. Eliminate Wrong Answers

Rule out options that are clearly incorrect or violate fundamental principles. This narrows down the choices.

3. Apply Core Principles

Use your knowledge of system design, design patterns, OOP, and networking to evaluate remaining options. Consider trade-offs and context.

4. Select Best Answer

Choose the option that best fits the question, balancing correctness and practicality. Avoid overcomplicating.

5. Review and Confirm

Quickly double-check your choice for consistency and to catch any misread details.

Key Points to Mention

  • SOLID principles and their application in OOP
  • Common design patterns (e.g., Singleton, Factory, Observer) and their use cases
  • Scalability, availability, and consistency trade-offs in system design
  • OSI model layers and common protocols (TCP/IP, HTTP, DNS)
  • CAP theorem and its implications for distributed systems
  • Separation of concerns and modular design

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q8

Resume deep-dive with DSA follow-ups: given a problem you solved, what if we added this constraint or changed this requirement?

Algorithms & Data StructuresTechnical Trade-offs
Author's notes

This was the format for the first F2F.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clearly restating the original problem, your initial solution, and its complexity. Then systematically analyze how the new constraint or requirement impacts the solution, discussing trade-offs and potential optimizations. Conclude by summarizing the revised approach and its complexity, showing adaptability and structured thinking.

Pro tip: Always connect the DSA discussion to real-world engineering trade-offs, such as scalability, maintainability, and cost, to demonstrate maturity beyond textbook solutions.

1. Restate the Original Problem and Solution

Briefly describe the problem, your initial approach, and its time/space complexity to establish a baseline.

2. Clarify the New Constraint or Requirement

Ask clarifying questions if needed, then explicitly state how the new constraint changes the problem's scope or assumptions.

3. Analyze Impact on the Solution

Evaluate how the new constraint affects the current algorithm's correctness, efficiency, and edge cases, identifying bottlenecks.

4. Propose and Compare Alternative Approaches

Suggest one or more modified or alternative algorithms, comparing their trade-offs in terms of time, space, and implementation complexity.

5. Summarize and Validate

Conclude with the recommended approach, its complexity, and how you would test or validate it under the new constraint.

Key Points to Mention

  • Time and space complexity analysis of both original and revised solutions
  • Trade-offs between different data structures or algorithms (e.g., hash maps vs. trees, sorting vs. heap)
  • Edge cases and how the new constraint introduces new ones
  • Scalability and performance implications in real-world systems
  • Potential optimizations like memoization, pruning, or parallelization
  • Clear communication of assumptions and decision rationale

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q9

Given a problem, design and implement a solution in a proper design-oriented way, not just a working solution.

System DesignTechnical Trade-offs
Author's notes

This is where I fell apart.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the problem requirements and constraints, then outline a high-level design that separates concerns and follows SOLID principles. Discuss trade-offs between different design choices, and finally implement the core components with clean, extensible code. Emphasize how your design supports future changes and scalability.

Pro tip: Demonstrate design maturity by explicitly stating assumptions and non-functional requirements (e.g., scalability, maintainability) early, and show how your design decisions address them. This signals you think beyond just making it work.

1. Clarify Requirements and Constraints

Ask questions to understand functional and non-functional requirements, such as expected load, latency, consistency, and extensibility needs. Confirm any assumptions with the interviewer.

2. High-Level Design

Sketch the main components, their responsibilities, and interactions. Apply separation of concerns and identify key abstractions, interfaces, and data flow.

3. Evaluate Trade-offs

Compare alternative designs (e.g., monolithic vs. microservices, SQL vs. NoSQL) and justify your choices based on requirements, discussing pros and cons.

4. Detailed Design and Implementation

Dive into critical components, define classes/interfaces, and implement core logic with clean, readable code. Highlight design patterns used and how they improve flexibility.

5. Review and Extend

Summarize how the design meets requirements, and discuss potential future extensions or improvements, showing awareness of evolving needs.

Key Points to Mention

  • SOLID principles and design patterns (e.g., Strategy, Factory, Observer) to ensure extensibility and maintainability.
  • Separation of concerns and modularity to isolate changes and facilitate testing.
  • Trade-offs between performance, scalability, consistency, and complexity.
  • Use of interfaces and dependency injection to decouple components.
  • Consideration of non-functional requirements like testability, observability, and deployment.
  • Clear documentation of assumptions and design rationale for team collaboration.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q10

System design and architecture questions in the final Tech Lead round.

System DesignTechnical Trade-offs
Author's notes

Mixed in with the implementation question.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the problem scope, functional and non-functional requirements, and constraints before diving into design. Then propose a high-level architecture, drill into critical components, and explicitly discuss trade-offs and alternatives. Finally, address scalability, reliability, and operational concerns, tying back to business goals.

Pro tip: Demonstrate leadership by proactively identifying potential failure points and mitigation strategies, and by asking about team structure and existing tech stack to tailor your design to Majid Al Futtaim's context.

1. Clarify Requirements

Ask questions to understand the problem's scope, expected scale, latency, consistency, and budget constraints. Confirm functional and non-functional requirements with the interviewer.

2. High-Level Design

Sketch the main components (e.g., clients, load balancers, services, databases, caches) and their interactions. Keep it simple and focus on the core flow.

3. Deep Dive

Choose one or two critical components (e.g., data storage, messaging) and discuss detailed design choices, data models, and algorithms. Explain how they meet the requirements.

4. Trade-offs and Alternatives

Compare your choices with alternatives (e.g., SQL vs NoSQL, monolith vs microservices) and justify decisions based on requirements. Acknowledge pros and cons.

5. Scalability and Reliability

Discuss how the design scales (horizontal vs vertical), handles failures (redundancy, retries, circuit breakers), and monitors performance. Mention operational aspects like deployment and observability.

Key Points to Mention

  • CAP theorem and consistency models (strong vs eventual) and their impact on user experience.
  • Caching strategies (e.g., Redis, CDN) and cache invalidation techniques.
  • Database sharding, replication, and indexing for scalability and performance.
  • Asynchronous processing and message queues (e.g., Kafka, RabbitMQ) for decoupling and resilience.
  • Microservices vs monolithic architecture and when to choose each.
  • Monitoring, logging, and alerting for production readiness.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.