3.18 Google SWE intern,两轮面经。两个面试官都挺友好,节奏顺畅。以下是完整复盘。

面试概况
| 项目 | 详情 |
|---|---|
| 公司 | |
| 岗位 | SWE Intern |
| 轮次 | 2 轮技术面 |
| 整体感受 | 顺利,面试官友好 |
| 日期 | 2026-03-18 |
第一轮
自我介绍 & 项目考察
开场先做自我介绍,随后面试官问了项目经历,沟通顺畅。
Coding:租车运力规划
题目描述
给定去年所有的租车订单,每个订单包含取车时间和还车时间。求:
- 满足所有订单需求的最少车辆数
- 给出一种车辆分配方案(示例即可)
解题思路
核心思路:差分 / 扫描线
将每个订单拆成两个事件:
- 取车时刻:
+1(需要一辆车) - 还车时刻:
-1(释放一辆车)
按时间排序后从左到右扫描,维护当前同时在用的车辆数,记录峰值即为最少车辆数。
注意边界:若取车和还车发生在同一时刻,先处理还车(-1)再处理取车(+1),可以复用刚归还的车。
车辆分配方案
用一个「空闲车辆池」:
- 取车时:从池中取出一辆(池空则新增一辆)
- 还车时:将该辆车放回池中
如此循环,可得到一种合法的分配示例。
代码框架
def min_cars(orders):
events = []
for start, end in orders:
events.append((start, 1)) # 取车 +1
events.append((end, -1)) # 还车 -1
# 同一时刻:先还车(-1)后取车(+1),复用车辆
events.sort(key=lambda x: (x[0], x[1]))
cur = 0
peak = 0
for _, delta in events:
cur += delta
peak = max(peak, cur)
return peak
def assign_cars(orders):
"""返回每个订单分配到的车辆编号(示例方案)"""
events = []
for i, (start, end) in enumerate(orders):
events.append((start, 1, i))
events.append((end, -1, i))
events.sort(key=lambda x: (x[0], x[1]))
pool = [] # 空闲车辆编号
next_car = 0 # 下一辆新车的编号
assignment = {} # order_idx -> car_id
active = {} # order_idx -> car_id(进行中的订单)
for time, delta, idx in events:
if delta == -1: # 还车
car = active.pop(idx)
pool.append(car)
else: # 取车
if pool:
car = pool.pop()
else:
car = next_car
next_car += 1
active[idx] = car
assignment[idx] = car
return assignment
复杂度分析
- 时间复杂度:O(n log n),主要来自排序
- 空间复杂度:O(n)
Follow-up:判断两个时间段是否重叠
给定区间 [a, b] 和 [c, d],判断是否重叠。
结论:两区间不重叠当且仅当 b <= c 或 d <= a(端点相切视为不重叠)。取反即为重叠条件:
def is_overlap(a, b, c, d):
# 重叠:既不是完全在左,也不是完全在右
return not (b <= c or d <= a)
第二轮
BQ 环节
面试官是白人工程师,聊天氛围轻松。BQ 问了两个问题:
- 讲一次你跟团队配合的经历
- 跟同事之间产生分歧怎么办
Coding 1:二叉树岛屿计数
题目描述
给定一棵二叉树,每个节点的值为 0 或 1。
**「1 的岛屿」**定义为:树中由连续 1 节点组成的区域(父子相连,中间没有 0 隔断)。
输入二叉树的根节点,返回岛屿的数量。
解题思路
递归遍历整棵树:
- 遇到值为
0的节点:断开连接,当前节点不属于任何岛屿,但其左右子树可能各自形成新的岛屿,对两个子树独立递归并累加岛屿数。 - 遇到值为
1的节点:合并,与父节点同属一个岛屿,继续向下递归。
关键:岛屿的计数发生在「从 0 节点向下看到 1 节点」或「根节点为 1」的时刻。
代码框架
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def count_islands(root):
"""返回二叉树中 1-岛屿的数量"""
def dfs(node, parent_is_one):
if node is None:
return 0
count = 0
if node.val == 1 and not parent_is_one:
# 新岛屿的起点
count += 1
count += dfs(node.left, node.val == 1)
count += dfs(node.right, node.val == 1)
return count
return dfs(root, False)
复杂度分析
- 时间复杂度:O(n),每个节点访问一次
- 空间复杂度:O(h),h 为树高,递归栈空间
Follow-up:如果树是图,怎么避免重复计数?
树变成图后,节点可能有多条路径可达,DFS/BFS 会重复访问同一节点导致岛屿重复计数。
解法:标记已访问节点
def count_islands_graph(graph, values):
"""
graph: {node_id: [neighbor_ids]}
values: {node_id: 0 or 1}
"""
visited = set()
def dfs(node, parent_is_one):
if node in visited:
return 0
visited.add(node)
count = 0
if values[node] == 1 and not parent_is_one:
count += 1
for neighbor in graph[node]:
count += dfs(neighbor, values[node] == 1)
return count
total = 0
for node in graph:
if node not in visited:
total += dfs(node, False)
return total
核心要点:
- 用
visited集合记录已处理节点,避免重复访问 - 遍历所有节点作为起点(处理非连通图)
- 其余逻辑与树版本一致
两题核心思路对比
| 题目 | 核心技巧 | 时间复杂度 | 空间复杂度 |
|---|---|---|---|
| 租车运力 | 差分扫描线 + 池化分配 | O(n log n) | O(n) |
| 二叉树岛屿 | DFS + 父节点状态传递 | O(n) | O(h) |
| 图岛屿(follow-up) | DFS + visited 去重 | O(V+E) | O(V) |
常见思维误区
| 题目 | 误区 | 正确方向 |
|---|---|---|
| 租车运力 | 直接枚举所有时间点 O(T) | 只处理事件时间点,扫描线 O(n log n) |
| 租车运力 | 同一时刻先取车后还车 | 先还车后取车,可复用车辆减少总数 |
| 二叉树岛屿 | 把「0节点」也计入岛屿 | 0节点是分隔符,不属于任何岛屿 |
| 图岛屿 | 不加 visited,重复计数 | 必须用 visited 集合标记已访问节点 |
Google 面试应试策略
临场节奏
- 先复述题目,确认理解无误再动手
- 先说思路,等面试官点头后再写代码
- 主动沟通 follow-up:问面试官「如果数据规模更大/结构变成图,有什么变化?」
- 写完代码后手动跑一个例子,验证边界(空树、全 0、全 1)
相关 LeetCode 练习
| 题号 | 题目 | 对应考点 |
|---|---|---|
| 56 | Merge Intervals | 区间扫描线 |
| 253 | Meeting Rooms II | 差分 / 最少资源 |
| 200 | Number of Islands | 岛屿计数 DFS |
| 547 | Number of Provinces | 图连通分量 |
| 695 | Max Area of Island | 岛屿 DFS 变体 |
🚀 需要 Google VO 辅助?
oavoservice 长期稳定承接 Google、Amazon、TikTok、Uber、Bloomberg、微软 等各大科技公司 OA / VO 辅助,国内外面试笔试均可,高频题库覆盖率极高。
立即添加微信:Coding0201
获取:
- ✅ Google VO 实时辅助(屏幕共享 + 实时打字提示)
- ✅ 高频真题题库(覆盖 80%+ 高频题)
- ✅ 一对一模拟面试 + 详细反馈
- ✅ VO 面试辅助(算法 + 系统设计)
📱 微信:Coding0201 | 💬 Telegram:@OAVOProxy | 📧 [email protected]
联系方式
Email: [email protected]
Telegram: @OAVOProxy