Quick Overview

This question evaluates understanding of concurrent resource management, advanced data structures for top-K and per-user queries, enforcement of caps and expirations, and algorithmic complexity guarantees while maintaining atomicity under concurrent operations.

Implement a GPU credit manager

Company: OpenAI

Role: Software Engineer

Category: Coding & Algorithms

Difficulty: medium

Interview Round: Technical Screen

Implement a GPU credit manager for a compute cluster. Each user has a nonnegative credit balance that can be increased (grantCredits(user, amount)), consumed when scheduling jobs (consume(user, amount) -> boolean), and refunded when jobs finish (refund(user, amount)). Support querying a user’s remaining credits (get(user) -> int) and retrieving the top K users by balance (topK(k) -> list). Enforce per-user maximum caps, optional per-organization aggregate caps, and optional credit expirations. Prevent balances from going negative and ensure atomicity under concurrent calls. Target O(log n) time per operation and near-linear space. Describe the data structures, provide pseudocode for each API, and analyze time and space complexity.

Quick Answer: This question evaluates understanding of concurrent resource management, advanced data structures for top-K and per-user queries, enforcement of caps and expirations, and algorithmic complexity guarantees while maintaining atomicity under concurrent operations.

Process a sequence of timestamped operations for a single-threaded GPU credit manager. Rules: - Every user starts with 0 credits. - `user_caps[user]` is that user's maximum balance. If a user is missing from `user_caps`, their cap is unlimited. - `user_org[user]` gives the user's organization. If a user is missing from `user_org`, they have no organization. - `org_caps[org]` is the maximum total active balance across all users in that organization. If an organization is missing from `org_caps`, its cap is unlimited. - Operations are given in nondecreasing timestamp order and are processed atomically. - Credits are stored in lots. A granted lot may expire at a specific timestamp. Before processing any operation at time `t`, all remaining credits from lots with `expire_time <= t` disappear. - When consuming credits, always consume from the earliest-expiring active lots first. Non-expiring lots are treated as expiring last. - `grant` and `refund` are partially applied if necessary: add as many credits as possible without violating the user cap or the organization cap. - Balances can never go negative. - `topK(k)` returns up to `k` users with positive balances, sorted by balance descending, then by user name ascending. Implement `solution(user_caps, user_org, org_caps, operations)` and return a list containing the result of every operation in order. Operation formats: - `('grant', t, user, amount, expire_time)` -> return the integer amount actually added. `expire_time` is an integer timestamp or `None`. - `('refund', t, user, amount)` -> return the integer amount actually added. Refunded credits never expire. - `('consume', t, user, amount)` -> return `True` if the full amount was consumed, otherwise `False`. - `('get', t, user)` -> return the user's current active balance. - `('topK', t, k)` -> return a list of `[user, balance]` pairs.

Constraints

  • 0 <= len(operations) <= 2 * 10^5
  • Operation timestamps are in nondecreasing order
  • 0 <= amount, cap <= 10^9
  • User and organization names are non-empty strings
  • If `expire_time` is not `None`, it is an integer timestamp; a lot with `expire_time <= t` is considered expired before time `t` operations run

Examples

Input: ({}, {}, {}, [])

Expected Output: []

Explanation: With no operations, there are no results to return.

Input: ({'alice': 10, 'bob': 7}, {'alice': 'org1', 'bob': 'org1', 'carol': 'org2'}, {'org1': 12, 'org2': 20}, [('grant', 1, 'alice', 8, 5), ('grant', 2, 'bob', 7, None), ('consume', 3, 'alice', 3), ('refund', 4, 'bob', 5), ('get', 4, 'bob'), ('topK', 4, 2), ('get', 5, 'alice'), ('topK', 6, 3)])

Expected Output: [8, 4, True, 3, 7, [['bob', 7], ['alice', 5]], 0, [['bob', 7]]]

Explanation: Bob's first grant is limited by the organization cap, Bob's refund is also capped, and Alice's remaining expiring credits disappear at time 5.

Hints

  1. You need two different orderings at once: earliest expiration for consuming/expiring lots, and largest current balance for `topK`. Heaps plus hash maps are a strong fit.
  2. For `topK`, avoid updating heap entries in place. Push new balance entries and skip stale ones later with lazy deletion.

Loading coding console...