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。你可以在服务和价格页面查看辅导选项;如果已经有面试时间,可以通过联系我们页面发送轮次和目标岗位。

Next
Next

Coinbase 面试题型总结整理:OA、Onsite、Coding、Cultural Alignment 和 MLE 怎么准备