2026 eBay 电面 Coding 面经:数组平衡和 + 二叉树子树计数 | 代面辅导

title: "2026 eBay 最新电面面经:两道 Coding 真题(数组平衡和 + 二叉树子树计数)" description: "ebay 技术电面两道核心 Coding 题详细解析:子数组最大平衡和 + 左右子树高度差判定,含 Follow Up 扩展思路与完整代码实现。"

2026 eBay 最新电面面经:两道 Coding 真题(数组平衡和 + 二叉树子树计数)

近期有同学拿到 eBay 的技术电面机会,分享了两道非常典型的 Coding 题目。一道考察数组/前缀和思维,另一道是二叉树递归 + 状态合并的经典。两道题目难度中等偏上,Follow Up 更是拉开区分度。下面逐题拆解思路、代码实现和 Follow Up 应对方案。

eBay 电面流程

Round 1:数组处理 —— 子数组最大"平衡和"

题目描述

给定一个整数数组,求其子数组的最大"平衡和"。

平衡和定义:子数组前半部分元素之和等于后半部分元素之和。子数组长度必须为偶数。

Follow Up:如果允许子数组中存在一个"调整元素"(即可以修改其中一个元素的值),如何找到最大平衡和的子数组?

解题思路

核心方法:前缀和 + 中点遍历

  1. 预处理前缀和数组 prefix[i] = nums[0] + nums[1] + ... + nums[i-1]
  2. 遍历所有可能的子数组 [l, r],要求长度 r - l + 1 为偶数
  3. 对于每个偶长度子数组,计算中点 mid = (l + r) // 2
  4. 前半和 = prefix[mid + 1] - prefix[l],后半和 = prefix[r + 1] - prefix[mid + 1]
  5. 若两半相等,记录该子数组的长度
  6. 返回满足条件的最大长度子数组的和

复杂度分析

维度 复杂度
时间 O(n²) — 遍历所有起点 + 终点组合
空间 O(n) — 前缀和数组

代码实现

def max_balanced_sum(nums):
    n = len(nums)
    if n < 2:
        return 0

    # 前缀和
    prefix = [0] * (n + 1)
    for i in range(n):
        prefix[i + 1] = prefix[i] + nums[i]

    best_sum = 0
    best_len = 0

    # 枚举子数组起点和终点
    for l in range(n):
        for r in range(l + 1, n):
            length = r - l + 1
            if length % 2 != 0:
                continue  # 跳过奇数长度

            mid = (l + r) // 2
            left_sum = prefix[mid + 1] - prefix[l]
            right_sum = prefix[r + 1] - prefix[mid + 1]

            if left_sum == right_sum:
                if length > best_len:
                    best_len = length
                    best_sum = left_sum + right_sum

    return best_sum, best_len

Follow Up:允许一个"调整元素"

核心思路转变:允许修改一个元素后,等价于判断是否可以通过增减某个值使前后半和相等。

优化方案

  • 对于每个偶长度子数组,计算 diff = abs(left_sum - right_sum)
  • 如果子数组中存在某个元素 x,使得 x >= diff(前半和小于后半时在前半增加,反之在后半减少),则该子数组可达平衡
  • 使用哈希表记录每个值出现的位置,加速查找
def max_balanced_with_adjustment(nums):
    """允许调整一个元素的最大平衡和"""
    n = len(nums)
    if n < 2:
        return 0

    prefix = [0] * (n + 1)
    for i in range(n):
        prefix[i + 1] = prefix[i] + nums[i]

    best_len = 0
    best_sum = 0

    for l in range(n):
        for r in range(l + 1, n):
            length = r - l + 1
            if length % 2 != 0:
                continue

            mid = (l + r) // 2
            left_sum = prefix[mid + 1] - prefix[l]
            right_sum = prefix[r + 1] - prefix[mid + 1]
            diff = abs(left_sum - right_sum)

            # 检查是否存在可调整元素
            can_adjust = False
            if left_sum < right_sum:
                # 需在前半部分找到 >= diff 的元素
                for j in range(l, mid + 1):
                    if nums[j] >= diff:
                        can_adjust = True
                        break
            elif left_sum > right_sum:
                # 需在后半部分找到 >= diff 的元素
                for j in range(mid + 1, r + 1):
                    if nums[j] >= diff:
                        can_adjust = True
                        break
            else:
                can_adjust = True  # 已经平衡

            if can_adjust and length > best_len:
                best_len = length
                best_sum = min(left_sum, right_sum) + min(left_sum, right_sum)

    return best_sum, best_len

平衡和问题解析

Round 2:二叉树 —— 满足条件的子树计数

题目描述

给定一棵二叉树,统计满足以下两个条件的子树数量:

  1. 左右子树高度差不超过 1(即平衡条件)
  2. 节点值总和为偶数

Follow Up:如果要求子树是"完全二叉树",该如何调整判断逻辑?

解题思路

核心方法:后序遍历 + 三值返回

后序遍历(左 → 右 → 根),每个节点返回三个值:

  • height:子树高度(空节点高度为 0)
  • sum:子树节点值总和(空节点总和为 0)
  • count:该子树内满足条件的子树数量

判定逻辑:

  • abs(left_height - right_height) <= 1 判断平衡
  • (left_sum + right_sum + node.val) % 2 == 0 判断偶数和
  • 两个条件同时满足时,计数器 +1

复杂度分析

维度 复杂度
时间 O(n) — 每个节点只访问一次
空间 O(h) — 递归栈深度,h 为树高

代码实现

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def count_valid_subtrees(root):
    """统计满足条件的子树数量"""
    result = [0]  # 用列表以便在递归中修改

    def post_order(node):
        """返回 (height, subtree_sum, valid_count)"""
        if not node:
            return 0, 0, 0

        left_h, left_sum, left_count = post_order(node.left)
        right_h, right_sum, right_count = post_order(node.right)

        # 当前子树的高度与总和
        current_h = max(left_h, right_h) + 1
        current_sum = left_sum + right_sum + node.val

        # 判断条件
        is_balanced = abs(left_h - right_h) <= 1
        is_even_sum = current_sum % 2 == 0

        # 累计满足条件的子树数
        valid = left_count + right_count
        if is_balanced and is_even_sum:
            valid += 1

        return current_h, current_sum, valid

    _, _, count = post_order(root)
    return count

Follow Up:完全二叉树判定

完全二叉树要求:除最后一层外,所有层完全填满,且最后一层节点全部靠左排列。

调整方案

每个节点额外返回 is_complete 标志:

def count_complete_balanced_even(root):
    """统计是完全二叉树 + 平衡 + 偶数和的子树"""
    if not root:
        return 0

    result = [0]

    def post_order(node):
        """返回 (height, subtree_sum, is_complete, valid_count)"""
        if not node:
            return 0, 0, True, 0

        left_h, left_sum, left_comp, left_count = post_order(node.left)
        right_h, right_sum, right_comp, right_count = post_order(node.right)

        current_h = max(left_h, right_h) + 1
        current_sum = left_sum + right_sum + node.val

        # 完全二叉树判定
        is_complete = left_comp and right_comp
        if left_comp and right_comp:
            if left_h > right_h:
                is_complete = False  # 左比右高超过1
            elif right_h > left_h:
                is_complete = False  # 右比左高
            # 若高度相同,则需进一步检查左子树是否填满
            # 简化版:高度差不超过1且左右都complete即可

        is_balanced = abs(left_h - right_h) <= 1
        is_even_sum = current_sum % 2 == 0

        valid = left_count + right_count
        if is_complete and is_balanced and is_even_sum:
            valid += 1

        return current_h, current_sum, is_complete, valid

    _, _, _, count = post_order(root)
    return count

二叉树子树计数流程

面试总结与 Tips

eBay Coding 面试特点

  1. 题目风格:偏重数据结构与算法基础,数组、字符串、二叉树是高频考点
  2. Follow Up:几乎每道题都有 Follow Up,考察思维延展能力 —— 即使基础解法正确,Follow Up 也是拉开区分度的关键
  3. 代码质量:注重边界条件处理(空数组、空树、单节点)、复杂度分析能力

备考建议

  • 前缀和技巧:数组区间和问题优先想到前缀和,注意 O(1) 查询的优势
  • 后序遍历模板:二叉树"子树属性聚合"类问题,后序遍历是最优选择
  • Follow Up 应对:面试时主动思考"如果条件变化会怎样",提前准备常见变体

如果你也在准备 eBay 或其他大厂的技术面试,需要一对一辅导或代面服务,欢迎通过 联系我们 了解更多。

Previous
Previous

2025-2026 Duolingo 多邻国 SDE 最新面经:OA + Karat + VO 全流程解析 | 代面辅导

Next
Next

Stripe OA 系统模拟题全解析 2026|Jupyter Load Balancer 五阶段递进挑战 + 完整代码