这次是在 Meta 的一轮算法/编码面试中,候选人连续遇到了两道常见但边界细节丰富的题目。面试官希望听到的是完整、稳健、面试级别的口头解题表达。
题目一:Set Matrix Zeroes
题面(英文原文)
Given a 2D matrix of integers which contains zeros in some entries, for each zero in the original matrix, set its row and column to zeros.
示例:
Input:
1 2 3
4 5 0
7 8 9
Output:
1 2 0
0 0 0
7 8 0
候选人思路输出(可直接照抄的表述)
我们需要基于原始矩阵中出现的 zero 来决定哪些行列被清零。不能在第一次遇到 0 时就直接修改,否则新的 0 会干扰后续判断。
因此我们可以把这个过程分成两步:
- 第一次遍历整个矩阵,记录所有包含 0 的行和列,可以用两个标记集合分别存行 index 和列 index。
- 第二次遍历整个矩阵,如果当前 cell 属于要清零的行或者要清零的列,就把它设为 0。
这种做法保证我们只根据原始 matrix 里的 zero 来做修改。
复杂度说明
- 时间复杂度:O(m × n)
- 空间复杂度:O(m + n)
候选人在这一段按上面的表述完整讲出了解法,并明确了两次遍历的必要性。
题目二:Merge Sorted Lists Iterator
题面(英文原文)
假设我们有多个已经排序的整数 list,接口定义如下:
hasNext() -> Bool
next() -> Int
连续调用 next() 时应当返回所有元素按升序排列的结果。例如:
Receiving the following lists:
0: [1,4,5,8,9]
1: [3,4,4,6]
2: [0,2,8]
Calling next() continuously in a loop yields the following results:
[0,1,2,3,4,4,4,5,6,8,8,9]
候选人思路输出(可直接照抄的表述)
这是一个多路有序合并的问题。我们可以用一个 min-heap(最小堆) 来维护每个 list 当前的最小可用值。
初始化阶段:
- 对于每个 list,如果不为空,就把该 list 的第一个元素和它的 list index 以及元素 index 一起推入最小堆。
每次调用 next() 时:
- 从最小堆弹出当前最小值及它对应的 list index 和元素 index。
- 把这个值作为
next()的返回值。 - 如果被弹出的元素所在 list 还有后续元素,就把下一个元素连同 list index 和新元素 index 推回最小堆。
hasNext()就是检查 min-heap 是否为空。
这种方法能确保每次 next() 都返回未返回过的最小值。
复杂度说明
next()和hasNext()的时间复杂度是 O(log k),k 是输入列表数量。- 额外空间来自堆,最坏 O(k)。
候选人在这一段用了上面的表达完整讲清楚了接口语义、堆的维护逻辑和循环流程。
这两道题我们如何辅助候选人
Meta 这类题目本身不难,但真正关注的是:
- 规则是否先说清楚
- 口头表达的完整性和严谨性
- 边界条件和实现结构有没有明确输出
CSOAHelp 在整个过程里提供的辅助不是零碎点醒,而是一句可以直接照着说出来、写成完整口头输出的解题文本。候选人只需要照着这个节奏讲逻辑、写结构,就能把两道题稳稳走完。
本篇的辅助输出是完整可直接复述的解法说明 + 复杂度分析,能在实战中让候选人提高“描述一致性”和“逻辑严谨性”,避免在面试官追问时出现中断或重构式回答。
如果你也在准备微软或者其他科技大厂的面试,也想要辅助老师随时帮你解决面试问题,不妨联系我们,预约我们的面试辅助服务。
我们也有代面试,面试辅助,OA代写等服务助您早日上岸~

