Databricks 面试题型总结整理:Tech Screen、Coding、System Design 和 VO 怎么准备
Databricks 面试题型总结整理:Tech Screen、Coding、System Design 和 VO 怎么准备
Databricks 的面试信号比较集中:tech screen、coding/algo、system design、architecture、HM,部分 loop 还会出现 system programming 或数据系统相关设计。近期面经里经常出现“多轮强度高”“题目要自己定义接口和测试”的反馈,所以准备时不能只刷单题。
本文基于近期公开面经标题和本地整理信号,不代表官方流程。
近期面经信号
- Phone screen/tech screen 很常见,题型包括树、KV store、hit counter、游戏/棋盘模拟、数据结构设计。
- VO 可能覆盖 coding、algo、architecture、HM、system programming。
- System design 常和数据平台、bookstore/vendor、distributed data system、front-end system design 等场景有关。
- 面试官可能要求自己写 test cases,并追问接口设计和效率。
面试真题题目合集
下面是 Databricks 相关面经里出现过的题目和题型摘要:
- RLE + Bit-Packing 压缩。
- RLE + Bit-Packing 解压。
- RLE 至少 8 个重复值才压缩的边界。
- Bit-Packing 每 8 个值一组的尾部处理。
- Lazy array 设计。
- Tic-tac-toe board 打印和游戏逻辑。
- Tic-tac-toe follow-up:AI random player。
- KV store。
- KV store follow-up:average get / average put。
- Hit counter / 最近 5 分钟平均统计。
- 2D grid BFS 最短路径。
- 2D grid transport mode 不能切换的最小成本路径。
- Ref/source string matching pair。
- Delete char follow-up。
- Distributed file system。
- Log Writer 系统编程题。
- Bookstore platform architecture。
- Frontend system design:song playlist app。
- Playlist app:add/remove/rearrange songs。
- Playlist app follow-up:多人协作编辑。
- Lazy array + heavy tests。
- 2D grid shortest min cost。
- File directory encode 最少 time cost。
- Fullstack system design:client-side edge cases。
- Storage / metadata / replication 相关设计。
真题整理与分析
Databricks 的题很有辨识度:喜欢把 coding、系统编程、存储、数据平台设计放在一起考。只刷普通算法不够。
真题 1:RLE + Bit-Packing 压缩/解压
题目大意:实现整数序列压缩,RLE 至少 8 个连续重复才压缩,Bit-Packing 每 8 个值一组,要求压缩和解压顺序一致,不能跳值或改顺序。
考点分析: 这是 Databricks 很典型的工程 coding。关键不是知道压缩名词,而是状态机写稳:怎么识别 run,什么时候 flush buffer,RLE 和 bit-packing 冲突时怎么选择,尾部不足 8 个怎么办,decode 如何验证格式合法。准备时要自己写一遍完整 encode/decode 和测试。
真题 2:Lazy array
题目大意:设计一个数组结构,支持延迟操作,比如批量 add/multiply/set 之类,要求不要每次操作都遍历全数组。
考点分析: 这题看 amortized thinking。你需要把全局 lazy tag 和单点 override 分开,明确操作顺序、组合规则和何时 materialize。面试官通常会用连续操作和单点查询来卡你。
真题 3:KV store + hit counter averageGet/averagePut
题目大意:实现 KV store,同时统计最近窗口内 get/put 平均耗时或平均次数,常见窗口是 5 分钟。
考点分析: 这题会从简单 class 走到时间窗口统计。准备 deque/ring buffer 两种写法,能解释 lazy cleanup、时间戳精度、并发更新和 memory bound。不要把所有历史请求都存下来。
真题 4:2D grid 最短路径 / 交通模式限制
题目大意:在二维矩阵里找最便宜路径,不同 transport mode 有不同 cost/time,且选了某种模式后不能随意切换。
考点分析: 这不是普通 BFS。状态里要包含当前位置和当前模式,边权不同时要用 Dijkstra;如果每种模式只能选一次,状态还要记录 mode。很多候选人挂在 state definition,而不是算法本身。
真题 5:Distributed file system / log writer / bookstore architecture
题目大意:系统设计出现过分布式文件系统、Log Writer、bookstore platform 等工程味很强的题。
考点分析: Databricks 面试官会追 consistency、failure recovery、metadata、replication、compaction、backpressure。回答时要避免只画 API,要说明写入路径、读路径、故障恢复路径和性能瓶颈。
高频题最优解速查
RLE + Bit-Packing
最优解思路: 写成状态机。扫描数组时先识别连续 run;run 长度 >= 8 用 RLE block,否则把值放入 bit-packing buffer。bit-packing 满 8 个值就 flush;最后处理不足 8 个的尾部。decode 必须按 block header 反向恢复。
复杂度: encode/decode 都是 O(n),额外空间 O(n) 输出。
面试要讲的边界: RLE 和 BP 的优先级、run 长度刚好 8、尾部不足 8、连续 run 之后的 buffer flush、非法 compressed input。
Lazy array
最优解思路: 如果操作是 add/multiply,可维护全局 affine transform:真实值 = raw * mul + add。单点 set 时,把写入值反解成 raw 存起来。查询时套全局 transform。
复杂度: range add/multiply O(1),set/get O(1)。
面试要讲的边界: set 和全局 lazy 操作的先后顺序;multiply by zero 时反解不可逆;整数溢出;是否需要 modulo。
KV store + rolling average
最优解思路: KV 本身 hashmap O(1)。统计最近 5 分钟平均值时,用 deque 存 (timestamp, duration),每次查询或写入前从队头清理过期项,同时维护 rolling sum/count。
复杂度: 单次操作 amortized O(1)。
面试要讲的边界: 时间戳乱序怎么办;窗口是按请求开始时间还是结束时间;并发更新 sum/count;历史数据不能无限增长。
2D grid transport shortest path
最优解思路: 如果边权不同,用 Dijkstra。状态不能只有 (r, c),还要包含当前 transport mode 或已经选择的 mode。dist[state] 表示到达该状态的最小 cost。
复杂度: O(states log states),states 通常是 m * n * modes。
面试要讲的边界: 是否允许切换交通方式;障碍格;同 cost tie-breaker;起点是否自带 mode;能否提前结束。
可直接练习的答案骨架
Coding sample:LazyArray
class LazyArray:
def __init__(self, nums):
self.raw = list(nums)
self.mul = 1
self.add = 0
def add_all(self, x):
self.add += x
def multiply_all(self, x):
self.mul *= x
self.add *= x
def get(self, i):
return self.raw[i] * self.mul + self.add
def set(self, i, value):
if self.mul == 0:
self._materialize()
self.raw[i] = (value - self.add) / self.mul
def _materialize(self):
self.raw = [self.get(i) for i in range(len(self.raw))]
self.mul = 1
self.add = 0
Coding sample:RLE block encoder skeleton
def encode(values):
out = []
i = 0
while i < len(values):
j = i
while j < len(values) and values[j] == values[i]:
j += 1
run_len = j - i
if run_len >= 8:
out.append(("RLE", values[i], run_len))
i = j
else:
buf = values[i:min(i + 8, len(values))]
out.append(("BP", buf))
i += len(buf)
return out
System design:Distributed log writer
flowchart LR
App["Writers"] --> API["Append API"]
API --> Sequencer["Sequencer"]
Sequencer --> Log[("Replicated Log")]
Log --> Storage[("Object Storage")]
Log --> Index[("Offset Index")]
Reader["Readers"] --> Index
Reader --> Storage
API design
POST /logs/{stream}/append
GET /logs/{stream}?offset=123&limit=100
POST /logs/{stream}/checkpoint
Data model
log_records(stream, offset, writer_id, payload, checksum, created_at)
stream_metadata(stream, next_offset, retention_policy, replica_count)
checkpoints(consumer_group, stream, offset, updated_at)
Databricks 面试里要强调顺序、幂等 append、checksum、backpressure、consumer checkpoint 和 compaction。
题目逐题答案速查
Coding:Tic-tac-toe
Sample code
class TicTacToe:
def __init__(self, n=3):
self.n = n
self.board = [[""] * n for _ in range(n)]
def move(self, r, c, player):
if self.board[r][c]:
raise ValueError("occupied")
self.board[r][c] = player
return self.winner(r, c, player)
def winner(self, r, c, p):
n = self.n
row = all(self.board[r][j] == p for j in range(n))
col = all(self.board[i][c] == p for i in range(n))
diag = r == c and all(self.board[i][i] == p for i in range(n))
anti = r + c == n - 1 and all(self.board[i][n - 1 - i] == p for i in range(n))
return row or col or diag or anti
Coding:hit counter / rolling average
Sample code
from collections import deque
class RollingAverage:
def __init__(self, window_seconds):
self.window = window_seconds
self.q = deque()
self.total = 0
def add(self, timestamp, value):
self.q.append((timestamp, value))
self.total += value
self._evict(timestamp)
def average(self, now):
self._evict(now)
return self.total / len(self.q) if self.q else 0
def _evict(self, now):
while self.q and self.q[0][0] <= now - self.window:
_, value = self.q.popleft()
self.total -= value
Coding:2D transport shortest path
Sample code
import heapq
def min_cost(grid, start, target, modes):
pq = [(0, start[0], start[1], None)]
dist = {}
while pq:
cost, r, c, mode = heapq.heappop(pq)
state = (r, c, mode)
if state in dist:
continue
dist[state] = cost
if (r, c) == target:
return cost
for nr, nc, next_mode, w in neighbors(grid, r, c, mode, modes):
if (nr, nc, next_mode) not in dist:
heapq.heappush(pq, (cost + w, nr, nc, next_mode))
return -1
Coding:string matching with delete char follow-up
答案骨架: 两指针比较 source/ref;delete follow-up 通常是允许 source 删除一个字符后匹配,状态变成 (i, j, deleted),可用 DP 或双指针分支一次。
System design:distributed file system
flowchart LR
Client --> NameNode["Metadata Service"]
Client --> DataNode["Data Nodes"]
NameNode --> Meta[("File Metadata")]
DataNode --> Blocks[("Block Storage")]
Replicator["Replication Worker"] --> DataNode
API design
POST /files
GET /files/{path}
PUT /files/{path}/blocks/{block_id}
GET /files/{path}/blocks
DELETE /files/{path}
Data model
files(path, owner, size, created_at, updated_at)
blocks(file_path, block_id, replica_nodes, checksum, size)
准备重点
Coding/Algo:练多 part 题。重点不是只做出第一问,而是能快速定义 function signature、写测试、解释复杂度并处理 follow-up。
Data/Distributed System:准备数据处理平台、任务调度、日志写入、KV store、hit counter、rate/window aggregation、worker failure recovery。
System Design:不要套模板。Databricks 相关设计题常看你是否理解数据系统的吞吐、延迟、容错、幂等和一致性。
HM:准备项目影响力、协作方式、为什么 Databricks、如何处理高强度和模糊问题。
7 天冲刺计划
- Day 1:练一套 tech screen,多 part coding。
- Day 2:练 KV store、hit counter、window stats。
- Day 3:练游戏/棋盘模拟和测试设计。
- Day 4:准备 distributed scheduler 或 log writer。
- Day 5:练一个数据系统 system design。
- Day 6:准备项目 deep dive 和 HM。
- Day 7:做 90 分钟 mixed mock。
常见失分点
- 函数接口没问清,导致后面返工。
- 只会写 brute force,不会讨论查询频率和优化。
- System design 没有明确数据规模、consistency 和 recovery。
- 测试只覆盖 happy path,没测 edge cases。
CTA
如果你已经拿到 Databricks 面试,建议做一次 coding + system design 的组合 mock。你可以在服务和价格页面查看辅导选项;如果已经有面试时间,可以通过联系我们页面发送轮次和目标岗位。