← 返回博客列表
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