2026 eBay 电面 Coding 面经:数组平衡和 + 二叉树子树计数 | 代面辅导
title: "2026 eBay 最新电面面经:两道 Coding 真题(数组平衡和 + 二叉树子树计数)" description: "ebay 技术电面两道核心 Coding 题详细解析:子数组最大平衡和 + 左右子树高度差判定,含 Follow Up 扩展思路与完整代码实现。"
2026 eBay 最新电面面经:两道 Coding 真题(数组平衡和 + 二叉树子树计数)
近期有同学拿到 eBay 的技术电面机会,分享了两道非常典型的 Coding 题目。一道考察数组/前缀和思维,另一道是二叉树递归 + 状态合并的经典。两道题目难度中等偏上,Follow Up 更是拉开区分度。下面逐题拆解思路、代码实现和 Follow Up 应对方案。

Round 1:数组处理 —— 子数组最大"平衡和"
题目描述
给定一个整数数组,求其子数组的最大"平衡和"。
平衡和定义:子数组前半部分元素之和等于后半部分元素之和。子数组长度必须为偶数。
Follow Up:如果允许子数组中存在一个"调整元素"(即可以修改其中一个元素的值),如何找到最大平衡和的子数组?
解题思路
核心方法:前缀和 + 中点遍历
- 预处理前缀和数组
prefix[i] = nums[0] + nums[1] + ... + nums[i-1] - 遍历所有可能的子数组
[l, r],要求长度r - l + 1为偶数 - 对于每个偶长度子数组,计算中点
mid = (l + r) // 2 - 前半和 =
prefix[mid + 1] - prefix[l],后半和 =prefix[r + 1] - prefix[mid + 1] - 若两半相等,记录该子数组的长度
- 返回满足条件的最大长度子数组的和
复杂度分析
| 维度 | 复杂度 |
|---|---|
| 时间 | 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(即平衡条件)
- 节点值总和为偶数
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 面试特点
- 题目风格:偏重数据结构与算法基础,数组、字符串、二叉树是高频考点
- Follow Up:几乎每道题都有 Follow Up,考察思维延展能力 —— 即使基础解法正确,Follow Up 也是拉开区分度的关键
- 代码质量:注重边界条件处理(空数组、空树、单节点)、复杂度分析能力
备考建议
- 前缀和技巧:数组区间和问题优先想到前缀和,注意 O(1) 查询的优势
- 后序遍历模板:二叉树"子树属性聚合"类问题,后序遍历是最优选择
- Follow Up 应对:面试时主动思考"如果条件变化会怎样",提前准备常见变体
如果你也在准备 eBay 或其他大厂的技术面试,需要一对一辅导或代面服务,欢迎通过 联系我们 了解更多。