Coding questions · Meta
Compute top-N outgoing spenders
This question evaluates a candidate's ability to design efficient aggregation and top-N ranking over transactional data, testing algorithm design, data structure knowledge, and complexity analysis within the Coding & Algorithms domain.
Add a feature to report the top N accounts by total outgoing payments across both immediate pays and scheduled payments. Implement: List<String> topNSpenders(int n) that returns N strings each formatted as "{accountId}{amount}", where amount is the cumulative spent amount for that account. Support online updates after every payment with O(log N) update time by maintaining per-account totals and a size-N min-heap (or equivalent). Specify tie-breaking rules, query/update complexity, and how deletions/merges affect the ranking.
Compute Top-N Outgoing Spenders
You are building the reporting feature for a bank system. Every payment a customer makes is an outgoing transfer of some amount from one account. You need to report the top N accounts ranked by their cumulative outgoing payment total.
Implement a function topNSpenders(payments, n) where:
paymentsis a list of[accountId, amount]pairs, one per outgoing payment, applied in order. The same account may appear many times; its outgoing total is the sum of all its amounts.nis the number of top spenders to return.
Return a list of at most n strings. Each string is the concatenation accountId + amount (the account id immediately followed by that account's cumulative outgoing total, as a string), for the top spenders.
Ranking rules:
- Primary: descending by cumulative outgoing total.
- Tie-break: when two accounts have the same total, the account whose id is smaller in lexicographic (ascending string) order comes first.
Return the top n entries by this ordering. If fewer than n accounts have made payments, return all of them. If no payments were made, return an empty list.
Note on complexity: in an online system you would maintain per-account running totals in a hash map and a size-N min-heap keyed on total so each payment updates the ranking in O(log N). Here the function recomputes from the full payment list, but the same tie-breaking and ordering rules apply.
Example: payments = [["acc1",100],["acc2",200],["acc1",50],["acc3",200]], n = 2 Totals: acc1=150, acc2=200, acc3=200. Ranked: acc2(200), acc3(200) [tie broken acc2<acc3], acc1(150). Top 2 -> ["acc2200", "acc3200"].
Constraints
- 0 <= number of payments
- 1 <= n
- amount is a non-negative integer
- accountId is a non-empty string
- If n exceeds the number of distinct accounts, return all accounts
- Ties on total are broken by ascending lexicographic accountId
Hints
- Accumulate each account's cumulative outgoing total in a hash map in a single pass over the payments.
- Sort accounts by (total descending, accountId ascending); a size-N min-heap keyed on total gives the same top-N in O(P log N) for the online case.
- Format each result by concatenating the account id directly with its total converted to a string, then take the first n entries.