OpenAI logo

OpenAI Medium Interview Questions

16 medium-level practice questions for OpenAI technical interviews

OpenAI software engineer interviews cover algorithms, data structures, system design, and coding problems drawn from real interview rounds.

Software Engineer Backend Engineer Frontend Engineer Full Stack Engineer Mobile Engineer Data Engineer Data Scientist ML Engineer DevOps Engineer DevOps Engineer Product Manager SRE Security Engineer Engineering Manager Data Analyst UX/UI Designer QA Engineer
coding Medium Verified Question #1

1. Implement cd Command


Category: Algorithm coding problem
Implement a simplified version of the Unix cd command. Given a current directory path and a relative destination path, return the final absolute...
Input: Given input
Output: Computed result
coding Medium Verified Question #2

2. Largest Subgrid


Category: Grid/matrix coding problem
You are given a 2D grid of non-negative integers and a maximum sum constraint. Find the largest size of a square sub-grid such that all...
Input: 2D grid
Output: Integer
coding Medium Verified Question #3

3. Virus Spread


Category: Grid/matrix coding problem
Simulate the spread of a virus through a grid. Each cell can be in one of three states: healthy, infected, or immune. *This is similar to a leetcode...
Input: 2D grid
Output: Integer
coding Medium Verified Question #4

4. Bot-Enabled Messaging System


Category: String coding problem
You are building a chat system that supports human users and automated bots. Messages are added to a channel log and may trigger bot responses. The...
Input: List
Output: Computed result
coding Medium Verified Question #5

5. GPU Credit Ledger


Category: String coding problem
You are designing a system to manage GPU credits. Each credit grant is valid during a specific time window. Events may arrive out of chronological...
Input: String
Output: Computed result
coding Medium Verified Question #6

6. GPU Credit Manager


Category: String coding problem
You are designing a system to manage GPU credits. Each credit grant is valid during a specific time window. Events may arrive out of chronological...
Input: String
Output: Computed result
coding Medium Verified Question #7

7. Version Support Finder


Category: Binary search coding problem
A software company maintains a sorted list of version strings in ascending chronological order. A critical feature was introduced in one version, and...
Input: List
Output: Computed result
coding Medium Verified Question #8

8. Monster Battle Simulator


Category: String coding problem
Simulate a deterministic, turn-based battle between two ordered teams of monsters. Execute the fight step by step and produce a chronological battle...
Input: List
Output: Computed result
coding Medium Verified Question #9

9. Distributed Tree Messaging


Category: Tree coding problem
You are implementing a message-passing protocol for a distributed system organized as a rooted n-ary tree. Each node represents a machine and...
Input: List
Output: Printed output
coding Medium dynamic programming #1

1. Dynamic Programming — Maximize the AI Model Performance

Background: OpenAI continuously strives to improve the performance of its machine learning models based on provided data inputs. Efficient optimization algorithms are crucial for predicting outcomes accurately and ensuring models are trained effectively.
Problem statement: Given a list of integers representing the performance scores of an AI system on different datasets, you need to determine the maximum sum of non-adjacent scores possible. This means you cannot select scores that are consecutive.
Function/class signature:
  • def max_non_adjacent_score(scores: List[int]) -> int:

Example 1:
  • Input: [3, 2, 5, 10, 7]

  • Output: 15

  • Explanation: Choose scores 3, 10, and 2 to get 3 + 10 + 2 = 15, skipping the adjacent 2 and 5.

Example 2:
  • Input: [1, 2, 3, 1]

  • Output: 4

  • Explanation: Choose scores 1 and 3 to get 1 + 3 = 4, avoiding the adjacent scores.

Constraints:
  • 0 <= scores.length <= 1000

  • 0 <= scores[i] <= 1000
coding Medium dynamic programming #2

2. Dynamic Programming — Maximum Path Sum in a Grid

Background: OpenAI often deals with large data flows and needs efficient algorithms to compute aggregates over its underlying data. Applications in AI systems and optimization problems can utilize these algorithms effectively.
Problem statement: Given a m x n grid filled with non-negative integers, find a path from the top-left corner to the bottom-right corner, which minimizes the sum of the values along the path. You can only move down or right at any point in time.
Function/class signature:
  • def min_path_sum(grid: List[List[int]]) -> int:

Example 1:
  • Input: [[1,3,1],[1,5,1],[4,2,1]]

  • Output: 7

  • Explanation: The path 1 → 3 → 1 → 2 → 1 minimizes the sum to 7.

Example 2:
  • Input: [[1,2,3],[4,5,6]]

  • Output: 12

  • Explanation: The path 1 → 2 → 3 → 6 minimizes the sum to 12.

Constraints:
  • 1 <= m, n <= 100

  • 0 <= grid[i][j] <= 100
coding Medium dynamic programming #3

3. Dynamic Programming — Subset Sum Problem

Background: OpenAI often deals with optimization problems that can benefit from strategies like the subset-sum problem. It's essential for resource allocation in AI training workflows where budget constraints are significant.
Problem statement: Given a set of n integers and a target integer target, determine if there's a subset of the given integers that adds up to exactly the target value. You should implement a function that efficiently solves this problem using dynamic programming.
Function/class signature:
  • def subset_sum(nums: List[int], target: int) -> bool:

Example 1:
  • Input: nums = [3, 34, 4, 12, 5, 2], target = 9

  • Output: True

  • Explanation: The subset {4, 5} adds up to 9.

Example 2:
  • Input: nums = [1, 2, 3, 7], target = 6

  • Output: True

  • Explanation: The subset {1, 2, 3} adds up to 6.

Constraints:
  • 0 < n <= 20

  • -1000 <= nums[i] <= 1000

  • 0 <= target <= 1000
coding Medium graph #4

4. Graph — Shortest Path in a Multi-Source Scenario

Background: In designing efficient AI systems, OpenAI needs to optimize routes for data points that originate from multiple sources. This is crucial for minimizing response times in API services that rely on complex data paths.
Problem statement: You are given an undirected graph represented as a list of edges, and multiple source nodes. Your task is to find the shortest distance from any of the source nodes to all other nodes in the graph. The distance between two connected nodes is uniformly 1.
Function/class signature:
  • def multi_source_shortest_path(edges: List[Tuple[int, int]], sources: List[int]) -> Dict[int, int]:


Example 1:
Input: edges = [(0, 1), (1, 2), (0, 2), (2, 3)], sources = [0]
Output: {0: 0, 1: 1, 2: 1, 3: 2}
Explanation: The shortest paths from node 0 are as follows: to itself is 0, to 1 is 1, to 2 is 1, and to 3 is 2.
Example 2:
Input: edges = [(0, 1), (1, 2), (2, 3), (3, 4), (4, 1)], sources = [1, 3]
Output: {0: 2, 1: 0, 2: 1, 3: 0, 4: 1}
Explanation: The shortest distances are calculated from both sources 1 and 3.
Constraints:
  • The number of edges (|E|) is between 1 and 10^5.

  • The number of nodes (|V|) is between 1 and 10^5.

  • Each edge connects two different nodes.

  • Nodes are labeled with integers from 0 to V-1.


coding Medium graph #5

5. Graph Traversal — Scheduling Human Labeling Tasks


Background: OpenAI often relies on human labelers to accurately annotate data for machine learning models. It is critical to ensure that labeling tasks are efficiently distributed among available labelers to maintain productivity and prevent overload.
Problem statement: Given a set of labelers, a list of tasks with required time to complete, and models that need this data, create a function that returns a balanced assignment of tasks to each labeler. Every label should have an equitable workload within a specified limit.
Function/class signature:
  • def assign_tasks(labelers: List[str], tasks: List[int], max_load: int) -> Dict[str, List[int]]:


Example 1:
  • Input: labelers = ['Alice', 'Bob', 'Charlie'], tasks = [3, 1, 4, 2, 5], max_load = 5

  • Output: {'Alice': [3, 2], 'Bob': [1, 4], 'Charlie': [5]}

  • Explanation: Each labeler has a total load that does not exceed the max_load of 5.


Example 2:
  • Input: labelers = ['Dave', 'Eve'], tasks = [1, 2, 3], max_load = 3

  • Output: {'Dave': [1, 2], 'Eve': [3]}


Constraints:
  • 1 <= len(labelers) <= 10

  • 1 <= len(tasks) <= 100

  • 0 <= tasks[i] <= 10

  • max_load > 0
coding Medium dynamic programming #6

6. Dynamic Programming — Minimum Cost Path in a 2D Grid

Background: In many machine learning applications at OpenAI, including reinforcement learning and optimization problems, finding efficient pathways is crucial. This problem relates to ensuring optimal resource allocation in grid environments, possibly related to robotics or game simulations.
Problem statement: Given a 2D grid costs where each integer represents the cost to step on that cell, write a function to find the minimum cost to reach the bottom right corner of the grid from the top left corner. You can only move down or right at any point in time.
Function/class signature:
  • def min_cost_path(costs: List[List[int]]) -> int:

Example 1:
  • Input: [[1, 3, 1], [1, 5, 1], [4, 2, 1]]

  • Output: 7

  • Explanation: The path is 1 -> 3 -> 1 -> 1 -> 1, total cost = 7.

Example 2:
  • Input: [[10, 2], [1, 1]]

  • Output: 3

  • Explanation: The path is 10 -> 1 -> 1, total cost = 3.

Constraints:
  • 1 ≤ costs.length, costs[i].length ≤ 100

  • 0 ≤ costs[i][j] ≤ 100
coding Medium dynamic programming #7

7. Dynamic Programming — Longest Increasing Subsequence

Background: OpenAI frequently works with time series data and machine learning models that involve sequential predictions. Identifying patterns, such as trends in data, is crucial for optimizing model performance.
Problem statement: Given an integer array nums, return the length of the longest increasing subsequence. A subsequence is formed by removing elements from the array without changing the order of the remaining elements. This problem is essential for analyzing sequences in large datasets relevant to OpenAI's products.
Function/class signature:
  • def length_of_LIS(nums: List[int]) -> int:

Example 1:
Input: nums = [10,9,2,5,3,7,101,18]
Output: 4
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4.
Example 2:
Input: nums = [0,1,0,3,2,3]
Output: 4
Explanation: The longest increasing subsequence is [0,1,2,3], therefore the length is 4.
Constraints:
  • 1 <= nums.length <= 2500

  • -10^4 <= nums[i] <= 10^4

Start practicing OpenAI questions

Sign up for free to access walkthroughs, AI-generated questions, and more.

Get Started Free