Airbnb 面试题型总结整理:Coding、Code Review、System Design 和 Past Experience 怎么准备
Airbnb 面试题型总结整理:Coding、Code Review、System Design 和 Past Experience 怎么准备
Airbnb 面试的特点是轮次结构比较综合:coding、code review、system design、past experience、HM/core value 都可能出现。近期面经里,多位候选人提到“某些轮很 solid,但 system design 或加面没过”,说明 Airbnb 不只看代码能不能写完,也看你能否解释设计、复盘项目和匹配团队价值观。
本文基于近期公开面经标题和本地整理信号,不代表官方流程。
近期面经信号
- Coding 里出现过 KV store、图/连锁效应、房源/booking 业务包装题。
- Code review 是重要信号轮,重视评论质量而不是评论数量。
- System design 常见 booking system、ticket system、pagination、agent/manager workflow。
- Past experience 常会深入项目架构图、技术取舍和个人贡献。
面试真题题目合集
下面是 Airbnb 相关面经里出现过的题目和题型摘要:
- Split stay / booking 分段入住。
- 给 hotels 可用日期和请求区间,判断能否覆盖完整 stay。
- Split stay follow-up:最多用两个 property 覆盖。
- Split stay follow-up:返回具体 property 分配方案。
- Linked list:有环链表 intersection。
- Linked list:无环/有环组合讨论。
- Chat system design。
- Chat system:schema、membership、message storage。
- Chat system follow-up:top N group chat。
- Search and booking/order query system。
- Distributed KV store。
- KV store:
get/put/delete。 - KV store:prefix pagination,例如
get(key*)。 - KV store:eventual consistency 和 high availability。
- Listings 页面超过 100 个时如何优化。
- Search result / listing page 性能优化。
- 地里银行类 coding。
- Retrier / retry wrapper 设计。
- Past experience:why Airbnb。
- Past experience:旅行经历和为什么选择 Airbnb。
- Past experience:跨时区协作。
- Past experience:风险决策和 expectation gap。
- Project deep dive。
真题整理与分析
Airbnb 的高频题很贴近业务:预订、库存、搜索、房源、聊天和用户体验。准备时要把“题目背后的产品约束”说出来。
真题 1:Split stay / booking 分段入住
题目大意:给定若干 hotel/property 的可用日期和用户请求区间 [start, end],判断能否用两个或多个 property 覆盖完整入住区间。
考点分析: 这题可以建成 interval coverage。关键是日期边界:入住日/离店日是否包含、区间能否无缝衔接、是否允许换房、最多换几次。基础解法可以排序 + greedy,follow-up 可能变成最少换房次数或返回具体方案。
真题 2:Linked list 有环 + intersection
题目大意:两个链表可能有环,判断是否相交,或返回交点。
考点分析: 这是经典题,但 Airbnb 会看你是否覆盖所有组合:无环/无环、有环/无环、有环/有环。准备时要能用 Floyd 找环入口,再分情况讨论。只写无环双指针是不够的。
真题 3:Chat system + topN group chat
题目大意:设计聊天系统,支持私聊/群聊、消息存储、在线状态,follow-up 追问 topN group chat 或热门群聊优化。
考点分析: 这题不能只说 WebSocket。要拆 message table、conversation table、membership table、read receipt、fanout on write/read。topN 部分要说明按什么窗口排序、是否近实时、如何防止大群写放大。
真题 4:Distributed KV store with prefix pagination
题目大意:实现或设计 KV store,支持 get/put/delete,以及按 prefix 分页读取,例如 get(key*),同时考虑 eventual consistency 和高可用。
考点分析: prefix pagination 会把普通 KV 拉向 LSM/tree/index 设计。要讲 key ordering、cursor token、page size、consistent snapshot,以及 delete tombstone。系统层面要讨论 replication 和读写一致性。
真题 5:Listings 页面超过 100 个时如何优化
题目大意:当搜索结果或房源列表超过 100 个,如何优化页面加载和用户体验。
考点分析: 这是前端/全栈候选人的高频业务题。回答要包括分页或无限滚动、图片懒加载、地图 marker 聚合、server-side ranking、缓存、首屏指标和 A/B 指标。不要只说“加缓存”。
高频题最优解速查
Split stay / booking interval coverage
最优解思路: 把每个房源可用时间看成 interval,目标是覆盖请求区间。通用解法是按 start 排序,用 greedy 每次选择在当前 covered_end 之前开始、并能延伸最远的 interval。若限制最多两个 property,可以枚举第一段或在扫描时记录最远覆盖。
复杂度: 排序 O(n log n),扫描 O(n)。
面试要讲的边界: 日期区间是闭区间还是 [checkin, checkout);是否允许中间换房;最多换几次;返回 boolean 还是实际房源列表。
有环链表 intersection
最优解思路: 先用 Floyd 找两个链表的环入口。无环/无环用双指针;一个有环一个无环必不相交;两个都有环时,如果环入口相同,交点可能在入环前,按无环交点处理;如果入口不同,绕环一圈看能否遇到另一个入口。
复杂度: O(n + m),空间 O(1)。
面试要讲的边界: 环入口就是交点;两个链表在环内相交但入口不同;链表为空;节点相等是 reference 相等,不是 value 相等。
Chat system + top N group chat
最优解思路: 核心表:conversation、membership、message、read_receipt。小群可 fanout on write,大群可 fanout on read。top N group chat 不要实时扫 message 表,可维护窗口计数或异步聚合。
复杂度: 发消息写入 O(1),fanout 取决于群大小;topN 用 heap/sorted set 更新通常 O(log n)。
面试要讲的边界: 大群写放大、离线消息、read receipt、消息顺序、重复投递、热门群计数窗口。
Prefix pagination KV store
最优解思路: key 要有序存储,可用 sorted map / LSM / B-tree。prefix 查询转成 [prefix, prefix_next) 范围扫描;分页用 cursor 记录最后一个 key 和 snapshot/version。
复杂度: 查询 O(log n + page_size)。
面试要讲的边界: cursor 不能只用 offset;删除 tombstone;分页期间数据变化;eventual consistency 下是否需要 stable snapshot。
可直接练习的答案骨架
Coding sample:Split stay interval coverage
def cover_stay(intervals, start, end):
intervals.sort()
ans = []
i = 0
cur = start
while cur < end:
best_end = cur
best_interval = None
while i < len(intervals) and intervals[i][0] <= cur:
if intervals[i][1] > best_end:
best_end = intervals[i][1]
best_interval = intervals[i]
i += 1
if best_interval is None:
return None
ans.append(best_interval)
cur = best_end
return ans
OOD class definition:Booking domain
from dataclasses import dataclass
@dataclass
class DateRange:
start: int
end: int
def can_connect_to(self, other):
return self.end == other.start
@dataclass
class PropertyAvailability:
property_id: str
available_range: DateRange
@dataclass
class StaySegment:
property_id: str
date_range: DateRange
class SplitStayPlanner:
def plan(self, availabilities, requested_range):
raise NotImplementedError
System design:Chat system
flowchart LR
Client --> Gateway["WebSocket/API Gateway"]
Gateway --> MessageAPI["Message Service"]
MessageAPI --> DB[("Message DB")]
MessageAPI --> Fanout["Fanout Workers"]
Fanout --> Push["Push/Notification"]
Client --> ReadAPI["Read Receipt API"]
ReadAPI --> DB
API design
POST /conversations
POST /conversations/{id}/messages
GET /conversations/{id}/messages?cursor=...
POST /conversations/{id}/read-receipts
GET /users/{id}/conversations
Data model
conversations(id, type, created_at)
conversation_members(conversation_id, user_id, role, joined_at)
messages(id, conversation_id, sender_id, body, created_at)
read_receipts(conversation_id, user_id, last_read_message_id, updated_at)
Airbnb 场景里要讲私聊、群聊、大群 fanout、消息顺序、未读数、删除/撤回和 topN group chat 的异步统计。
题目逐题答案速查
Coding:linked list cycle + intersection
Sample code
def cycle_entry(head):
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow is fast:
slow = head
while slow is not fast:
slow = slow.next
fast = fast.next
return slow
return None
def intersect_no_cycle(a, b):
p, q = a, b
while p is not q:
p = p.next if p else b
q = q.next if q else a
return p
讲解重点: 两个都有环时,若入口相同,交点可能在入环前;若入口不同,绕一个环看能否遇到另一个入口。
Coding:retrier
Sample code
import random
import time
def retry(fn, max_attempts=3, base_delay=0.1):
for attempt in range(max_attempts):
try:
return fn()
except Exception:
if attempt == max_attempts - 1:
raise
delay = base_delay * (2 ** attempt)
jitter = random.uniform(0, delay)
time.sleep(delay + jitter)
OOD:booking split stay
classDiagram
class Property {
property_id
location
}
class Availability {
property_id
start_date
end_date
}
class StaySegment {
property_id
start_date
end_date
}
class SplitStayPlanner {
plan(request, availabilities)
}
SplitStayPlanner --> Availability
SplitStayPlanner --> StaySegment
System design:search and booking order query
Flow
flowchart LR
Client --> SearchAPI["Search API"]
SearchAPI --> SearchIndex[("Listing Search Index")]
Client --> BookingAPI["Booking API"]
BookingAPI --> BookingDB[("Booking DB")]
BookingAPI --> Payment["Payment Service"]
API design
GET /search?location=...&checkin=...&checkout=...
POST /bookings
GET /bookings/{id}
GET /users/{id}/trips
Data model
listings(id, host_id, location, capacity, status)
availability(listing_id, date, available, price)
bookings(id, listing_id, guest_id, checkin, checkout, status)
Frontend:listings > 100 optimization
答案骨架: server-side pagination + ranking;图片 lazy loading;map marker clustering;首屏只取 above-the-fold;滚动分页用 cursor;缓存搜索条件和结果。
准备重点
Coding:准备业务包装题,不要只记 LeetCode 原题。要能把题抽象成图、KV、interval、reservation、state transition。
Code Review:重点看正确性、边界、测试、幂等、权限和性能。评论要有 priority,不能只挑命名。
System Design:Booking 类题重点是库存、hold、支付、超时、取消和防止重复预订;ticket 类题重点是 claim、routing、SLA metrics。
Past Experience:准备一张架构图,讲清目标、团队规模、你的模块、指标、tradeoff 和失败复盘。
7 天冲刺计划
- Day 1:整理 Airbnb 目标岗位和轮次。
- Day 2:练业务包装 coding。
- Day 3:练 code review mock。
- Day 4:准备 booking system。
- Day 5:准备 ticket/support system。
- Day 6:整理 past experience 项目。
- Day 7:做一轮 full loop 模拟。
常见失分点
- System design 前面 clarification 花太久,后面没时间 deep dive。
- Code review 评论太浅,只说风格不说生产风险。
- Past experience 没有图、没有指标、没有个人贡献比例。
- Core value/HM 回答太泛,听起来不像 Airbnb 定向准备。
CTA
如果你已经拿到 Airbnb 面试,建议按具体轮次做组合训练:coding、code review、system design 和 past experience。你可以在服务和价格页面查看服务;也可以通过联系我们页面发送面试时间和轮次安排。