This is not another LeetCode-style prep list. It is a structured retrospective from the oavoservice team built on 30+ Citadel SDE Intern OA debriefs during the 2026 Spring / Summer cycle. We compiled the question types they actually faced on HackerRank, the platform quirks, the final score distribution, and — the seven facepalm moments every candidate had afterwards. Reading this won't let you guess the exact problems, but it will keep you from wasting your 70 minutes.
1. Where do these 30+ debriefs come from?
The sample covers Nov 2025 — May 2026, 33 candidates who took the Citadel SDE Intern (including Citadel Securities Software Engineer Intern) OA via the oavoservice channel. Roles covered:
- Chicago / NYC SDE Intern (19 people)
- Citadel Securities Software Engineer Intern (9 people)
- Dallas Quant Tech Intern (5 people, OA identical to SDE)
Key takeaway: question distribution is no longer the 2024-style "prefix sum + sliding window" monoculture. In 2026, graph problems and implementation/simulation tasks are noticeably up, and HackerRank rolled out two new features — forced fullscreen and clipboard blocking from external sources.
2. HackerRank platform experience: what real candidates say
| Dimension | Observed | Candidate complaints |
|---|---|---|
| Check-in flow | Camera snapshot + ID scan (mandatory for NYC roles) | Camera permission popup hung for 5 min on some Macs |
| Fullscreen | Forced; 3rd switch triggers a warning | On Mac, even Cmd+Tab counts as a switch |
| Clipboard | External paste blocked, in-editor copy still works | RIP for anyone hoping to paste from ChatGPT |
| Editor | Built-in Monaco, supports Python 3.10 / C++17 / Java 17 | No autocomplete; IDE-spoiled folks struggle |
| Duration | 70 min (2 problems) / 90 min (3 problems, rare) | 70 min is widely felt as tight |
| Custom run | Allowed but only stdout shown | You cannot print hidden cases |
| Grading | Auto-graded on submit, 8-15 hidden cases | Pass-rate is visible — you literally watch yourself fail |
A CMU candidate said it best: "The biggest surprise wasn't the difficulty — it was being asked to upload an ID scan right before the timer started. Anyone unprepared lost 10 minutes there."
3. Question distribution from 30+ samples
We binned all problems from 33 OAs (71 problems total, factoring in 3-problem sets) by topic:
| Category | Share | Occurrences | Self-rated difficulty (1-5) |
|---|---|---|---|
| Array / String / Prefix Sum | ~45% | 32 | 3.0 |
| Graph BFS / Shortest Path | ~25% | 18 | 3.8 |
| DP / Interval DP | ~20% | 14 | 4.0 |
| Implementation / Simulation | ~10% | 7 | 3.5 |
Score distribution (out of 100, weighted equally per problem):
[90-100] ## 12%
[70-89] ###### 37%
[50-69] ######## 42%
[<50] ## 9%
Per recruiter feedback, the cutoff for moving forward is typically 70+, but Quant Tech roles have advanced candidates with 62 when headcount is tight.
4. Type 1: Array / Prefix Sum (highest frequency)
Reconstructed problem: water-level balance window
A river has n sensors;
levels[i]is the reading of sensor i. Find the longest contiguous segment[l, r]such thatmax(levels[l..r]) - min(levels[l..r]) <= D.
6 of 10 sample debriefs hit a variant of this (re-skinned as "prices", "temperatures", etc.).
from collections import deque
def longest_balanced(levels, D):
n = len(levels)
max_q, min_q = deque(), deque() # monotonic queues
l = 0
best = 0
for r in range(n):
# max queue: monotonically decreasing
while max_q and levels[max_q[-1]] <= levels[r]:
max_q.pop()
max_q.append(r)
# min queue: monotonically increasing
while min_q and levels[min_q[-1]] >= levels[r]:
min_q.pop()
min_q.append(r)
# shrink left until valid
while levels[max_q[0]] - levels[min_q[0]] > D:
l += 1
if max_q[0] < l:
max_q.popleft()
if min_q[0] < l:
min_q.popleft()
best = max(best, r - l + 1)
return best
Complexity: O(n) time, O(n) space. Pitfall: a naive O(n²) attempt fails half the hidden cases at n=10^5; monotonic queue / two-pointer is the floor.
5. Type 2: Graph BFS / Shortest Path
Reconstructed problem: cluster latency via a key node
A data center has n servers connected by a weighted undirected graph
edges[i] = [u, v, w](latency). A request must travel fromstotwhile passing through at least one key node from setK. Return the minimum total latency.
4 candidates hit this or a variant ("must pass a gas station", "must pass a transit hub").
import heapq
def shortest_via_keypoint(n, edges, s, t, keypoints):
graph = [[] for _ in range(n)]
for u, v, w in edges:
graph[u].append((v, w))
graph[v].append((u, w))
def dijkstra(src):
dist = [float('inf')] * n
dist[src] = 0
pq = [(0, src)]
while pq:
d, u = heapq.heappop(pq)
if d > dist[u]:
continue
for v, w in graph[u]:
if d + w < dist[v]:
dist[v] = d + w
heapq.heappush(pq, (dist[v], v))
return dist
dist_s = dijkstra(s)
dist_t = dijkstra(t)
best = float('inf')
for k in keypoints:
if dist_s[k] + dist_t[k] < best:
best = dist_s[k] + dist_t[k]
return -1 if best == float('inf') else best
Complexity: O((V + E) log V). Pitfall: many candidates default to plain BFS forgetting edges are weighted — instant zero. Confirm edge weights before choosing the algorithm.
6. Type 3: Implementation / Simulation
Reconstructed problem: order book event replay
Given a time-ordered event stream
events, each(timestamp, side, price, qty, type)withtype ∈ {ADD, CANCEL, MATCH}, replay all events and return the best bid / best ask with their total quantities at the end.
5 samples saw it (concentrated in Citadel Securities roles).
from sortedcontainers import SortedDict
def replay_book(events):
bids = SortedDict() # price -> qty (bids; pick highest)
asks = SortedDict() # price -> qty (asks; pick lowest)
orders = {} # order_id -> (side, price, qty)
for ts, oid, side, price, qty, etype in events:
if etype == 'ADD':
book = bids if side == 'B' else asks
book[price] = book.get(price, 0) + qty
orders[oid] = (side, price, qty)
elif etype == 'CANCEL':
if oid in orders:
s, p, q = orders.pop(oid)
book = bids if s == 'B' else asks
book[p] -= q
if book[p] <= 0:
del book[p]
elif etype == 'MATCH':
# match against the opposite-side top
book = asks if side == 'B' else bids
remaining = qty
while remaining > 0 and book:
top_price = book.keys()[0] if side == 'B' else book.keys()[-1]
fill = min(book[top_price], remaining)
book[top_price] -= fill
remaining -= fill
if book[top_price] == 0:
del book[top_price]
best_bid = (bids.keys()[-1], bids[bids.keys()[-1]]) if bids else None
best_ask = (asks.keys()[0], asks[asks.keys()[0]]) if asks else None
return best_bid, best_ask
Complexity: O(E log P) where E is event count, P is unique prices. Pitfall: HackerRank's Python env ships sortedcontainers, but C++ users must use std::map, not unordered_map.
7. Pitfall summary (7 items, sorted by frequency)
- Coding before reading the full prompt — 5 candidates missed the "must pass at least one keypoint" clause and submitted a plain shortest-path: zero points.
- Submitting once samples pass — hidden cases cover n=1, empty input, all-equal arrays. At least 9 candidates dropped from a perceived 100 to 60.
- Brute force timing out — O(n²) on n=10^5 is a guaranteed TLE. Monotonic queue / two-pointer is the baseline.
- Python
list.pop(0)— O(n); usecollections.dequeinstead. - Forgetting bidirectional edges — single-direction append breaks connectivity.
- Triggering switch-screen flags — Mac users especially;
Cmd+Tabto check time counts. Mute notifications beforehand. - Forgetting to click Submit at the buzzer — HackerRank does not auto-submit unfinished problems; at least 3 candidates lost everything to this.
8. Score-boost techniques (from candidates)
8.1 Edge-case checklist (write at the start)
- n = 0 / n = 1
- All-equal / all-distinct
- Extreme size (10^5 ~ 10^6)
- Negatives and zero
- Duplicates (multi-edges in graphs, same price/qty in order book)
8.2 70-minute time budget (empirically optimal)
| Window | Task | Key action |
|---|---|---|
| 0-5 min | Read both problems | Tag "safe" vs "gamble"; do safe first |
| 5-25 min | Problem 1 | Brute → optimize → 3 edge tests |
| 25-55 min | Problem 2 | Even partial — submit a 50% solution |
| 55-65 min | Hidden-case patch | Best ROI window for extra points |
| 65-70 min | Confirm both submitted | Verify "Submitted" status |
8.3 Debugging tips
- Don't print-debug — use
assertat key checkpoints. - Trace one tiny n=3 input by hand; this catches more bugs than rerunning samples.
- In Python, wrap test code in
if __name__ == '__main__':and comment out before submit.
9. FAQ
Q1: What score gets you past Citadel OA in 2026?
Per 33 candidates, the typical bar for SDE Intern is 70/100, Citadel Securities skews stricter at 75+, and one Quant Tech candidate advanced with 62 (tight headcount). Score isn't the sole factor — hidden-case hit rate, code style, and submission timing all matter.
Q2: Is the new "forced fullscreen" really strict? Will a VPN or VM get flagged?
Switching out 3 times triggers a warning; the 4th terminates the session. VMs aren't auto-detected, but if the camera snapshot looks black or static, a human will review. We strongly recommend a normal setup.
Q3: Are Citadel OA and Citadel Securities OA the same?
The core algorithms overlap ~70%, but Citadel Securities has a higher share of implementation problems (order book, matching, market making) and the prompts use trading vocabulary. 6 of 9 Citadel Securities candidates got an order-book problem.
Q4: How long is the cooldown after a fail?
Official cooldown is 6 months, but switching role family within the same year (Intern → New Grad, Chicago → NYC) can bypass it. Write a debrief immediately after, send it to the recruiter — staying on their radar matters.
Q5: Will Python be too slow for Citadel OA?
22 of 33 candidates used Python; only 2 hit TLE, both with O(n²). For n ≤ 10^6, correct complexity in Python is sufficient. C++/Java win on constants but cost time to write — not always worth it.
10. Need weekly Citadel OA frequents / debrief access?
A failed Citadel OA means six months on ice, so the first attempt is high-leverage. We track new variants weekly and provide:
- Weekly high-frequency problems + a 30+ candidate debrief library
- HackerRank-pace 70-min timed mocks
- OA proxy completion (full marks) / live VO assistance
- Resume polish and Citadel referral pipeline
Get in touch:
- WeChat: Coding0201 · Contact us
- Email: [email protected]
- Telegram: @OAVOProxy
Contact
Email: [email protected]
Telegram: @OAVOProxy
WeChat: Coding0201
Last updated: 2026-05-18 | Author: oavoservice interview team | Sample: 33 Citadel SDE Intern candidates from the 2026 cycle