ZipRecruiter (NYSE: ZIP), one of the largest U.S. job platforms, runs an OA that aligns tightly with its product: Job Matching scoring, string similarity, and Skill Graph. This review covers SDE and Data Scientist tracks based on the last year of community reports, with full solutions and an OA assist playbook.
ZipRecruiter OA Snapshot
| Dimension | Detail |
|---|---|
| Platform | HackerRank |
| Duration | 75 minutes |
| Questions | 2–3 (one SQL or probability) |
| Focus | Strings, match scoring, graphs, SQL |
| Grading | Auto + partial code-style deductions |
| Pass rate | ~45% per community |
Track 1: Job Matching Score
Surface
Given Job(id, title, skills, salary) and a list of Candidate(id, skills, expected_salary), implement match_score(job, candidate) returning a 0–100 match score.
Scoring rules (prompt-specified)
- skill overlap: +10 per match
- salary: candidate's expected ≤ job ceiling → +20; otherwise discount by gap
- title keyword: title contains candidate's top skill → +10
Python Solution
def match_score(job, candidate):
score = 0
js = set(job['skills'])
cs = set(candidate['skills'])
score += 10 * len(js & cs)
if candidate['expected_salary'] <= job['salary']:
score += 20
else:
diff = candidate['expected_salary'] - job['salary']
score += max(0, 20 - diff // 1000)
title_lower = job['title'].lower()
for s in candidate.get('top_skills', []):
if s.lower() in title_lower:
score += 10
break
return min(100, score)
Trap: the gap-to-deduction mapping is literally specified in the prompt — never improvise. The most common bug is diff / 1000 (float) instead of diff // 1000 (int), which throws off rounding.
Track 2: String Similarity
Surface
Given strings query and title, compute:
- longest common substring length
- edit distance
- token Jaccard
Most common follow-up: filter titles[] where edit_distance(query, t) ≤ k.
Python Solution (edit distance + filter)
def edit_distance(a, b):
m, n = len(a), len(b)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m + 1):
dp[i][0] = i
for j in range(n + 1):
dp[0][j] = j
for i in range(1, m + 1):
for j in range(1, n + 1):
if a[i - 1] == b[j - 1]:
dp[i][j] = dp[i - 1][j - 1]
else:
dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1])
return dp[m][n]
def filter_titles(query, titles, k):
return [t for t in titles if edit_distance(query, t) <= k]
Optimization: with 10^5 titles (hidden case reported), pre-filter by length: skip when abs(len(q)-len(t)) > k.
Track 3: Skill Graph
Surface
Given (parent, child) skill edges (e.g., Java → Spring, Spring → SpringBoot), implement:
descendants(skill): return all child skillsis_related(a, b): is a an ancestor of b?
Python Solution
from collections import defaultdict, deque
class SkillGraph:
def __init__(self, edges):
self.children = defaultdict(set)
self.parents = defaultdict(set)
for p, c in edges:
self.children[p].add(c)
self.parents[c].add(p)
def descendants(self, skill):
result = set()
q = deque([skill])
while q:
cur = q.popleft()
for c in self.children[cur]:
if c not in result:
result.add(c)
q.append(c)
return result
def is_related(self, a, b):
return b in self.descendants(a)
Trap: graphs may cycle (A→B, B→A is a reported hidden case). Use a visited set to avoid infinite loops.
Frequency Distribution
| Track | Frequency | Key Surface | Common Trap |
|---|---|---|---|
| Job Matching | ★★★★★ | Dict + literal rules | Float rounding |
| String similarity | ★★★★ | Edit distance + length pre-filter | Large input TLE |
| Skill Graph | ★★★★ | BFS + cycle handling | Self-cycle |
| SQL Top-K Recommendation | ★★★ | Window + JOIN | Partition boundary |
| Resume keyword extraction | ★★ | Regex + lexicon | Case sensitivity |
OA Assist Playbook
What oavoservice OA assist gives you
- Question bucketing: Job Matching / string / graph / SQL — 4 variants per bucket
- Large-input optimization: edit-distance length pre-filter, string preprocessing templates
- Live OA assist: low-latency idea check + edge-case nudges
- VO transition: 4-round onsite (coding + sysdesign + BQ + HM), same mentor
A "rule-literal" checklist
ZipRecruiter loves stacking literal scoring rules: "salary gap divides by 1000 with max 20 deduction", "skill overlap +10 per hit". We maintain a rule-literal checklist that catalogs every "you must follow the prompt exactly, do not optimize" scoring rule. OA assist members get it directly.
Add WeChat Coding0201 for pricing and scope.
FAQ
What languages does ZipRecruiter OA accept?
All HackerRank-supported languages. Community shows Python / Java each at ~40%.
How fast does ZipRecruiter move?
Phone screen typically within 5–7 days — quicker than FAANG.
Overlap with Indeed / LinkedIn?
String + Graph overlap ~60%; Job Matching is ZipRecruiter-specific.
Cooldown if I fail?
Usually 6 months. Cross-role (SDE → DS) goes into a different pool.
Preparing for ZipRecruiter / Indeed / LinkedIn / Glassdoor?
oavoservice tracks job platform companies (ZipRecruiter / Indeed / LinkedIn / Glassdoor / Handshake). Our mentors come from live matching / search / recommendation teams and deliver question bucketing, rule-literal training, large-input optimization, and HackerRank simulation.
👉 Add WeChat: Coding0201 for the ZipRecruiter bank and OA assist plan.
Contact
Email: [email protected]
Telegram: @OAVOProxy