← 返回博客列表
Google

Google SWE 實習面經:租車運力規劃 + 二元樹島嶼計數(兩輪順利通過)

2026-03-18

3.18 Google SWE intern,兩輪面經。兩個面試官都挺友善,節奏順暢。以下是完整複盤。

Google Logo


面試概況

項目 詳情
公司 Google
職位 SWE Intern
輪次 2 輪技術面
整體感受 順利,面試官友善
日期 2026-03-18

第一輪

自我介紹 & 項目考察

開場先做自我介紹,隨後面試官問了項目經歷,溝通順暢。

Coding:租車運力規劃

題目描述

給定去年所有的租車訂單,每個訂單包含取車時間還車時間。求:

  1. 滿足所有訂單需求的最少車輛數
  2. 給出一種車輛分配方案(示例即可)

解題思路

核心思路:差分 / 掃描線

將每個訂單拆成兩個事件:

按時間排序後從左到右掃描,維護當前同時在用的車輛數,記錄峰值即為最少需要的車輛數。

注意邊界:若取車和還車發生在同一時刻,先處理還車(-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

複雜度分析

Follow-up:判斷兩個時間段是否重疊

給定區間 [a, b][c, d],判斷是否重疊。

結論:兩區間不重疊當且僅當 b <= cd <= a(端點相切視為不重疊)。取反即為重疊條件:

def is_overlap(a, b, c, d):
    # 重疊:既不是完全在左,也不是完全在右
    return not (b <= c or d <= a)

第二輪

BQ 環節

面試官是白人工程師,聊天氛圍輕鬆。BQ 問了兩個問題:

  1. 講一次你跟團隊配合的經歷
  2. 跟同事之間產生分歧怎麼辦

Coding 1:二元樹島嶼計數

題目描述

給定一棵二元樹,每個節點的值為 01

**「1 的島嶼」**定義為:樹中由連續 1 節點組成的區域(父子相連,中間沒有 0 隔斷)。

輸入二元樹的根節點,返回島嶼的數量

解題思路

遞迴遍歷整棵樹:

關鍵:島嶼的計數發生在「從 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)

複雜度分析

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

核心要點


兩題核心思路對比

題目 核心技巧 時間複雜度 空間複雜度
租車運力 差分掃描線 + 池化分配 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 面試應試策略

臨場節奏

  1. 先複述題目,確認理解無誤再動手
  2. 先說思路,等面試官點頭後再寫程式碼
  3. 主動溝通 follow-up:問面試官「如果數據規模更大/結構變成圖,有什麼變化?」
  4. 寫完程式碼後手動跑一個例子,驗證邊界(空樹、全 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

獲取:

📱 微信:Coding0201 | 💬 Telegram:@OAVOProxy | 📧 [email protected]


聯繫方式

Email: [email protected]
Telegram: @OAVOProxy