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