这是候选人在 AppLovin Software Engineer 面试中遇到的一道算法题。面试官给出一个整数数组 nums,要求返回一个新数组 result,其中 result[i] 等于数组中除 nums[i] 以外所有元素的乘积。
Example:
input: [2, 4, 3, 5]
output: [60, 30, 40, 24]
Explanation:
60 = 4 × 3 × 5
30 = 2 × 3 × 5
40 = 2 × 4 × 5
24 = 2 × 4 × 3
面试过程细节
面试官先确认候选人是否理解题意。
候选人复述问题:
我们需要返回一个数组,每个位置的值等于整个数组的乘积,但不包括当前元素。
面试官点头确认,然后继续追问:
Interviewer
Can you think of a straightforward solution first?
候选人先给出了一个最直观的思路:
每个位置遍历整个数组,把除了自己之外的所有数相乘。
候选人解释:
如果数组长度是 n,那么每个元素都要遍历 n 次,总复杂度是:
O(n²)
面试官继续问:
Can we do better?
候选人优化思路
候选人开始重新思考。
如果每次都重新乘一遍数组,其实很多计算是重复的。
于是他提出一个关键想法:
把数组拆成两部分:
左边所有元素的乘积
右边所有元素的乘积
对于每个位置 i:
result[i] = 左边乘积 × 右边乘积
举个例子:
nums = [2,4,3,5]
对于 3 这个位置:
左边乘积 = 2 × 4
右边乘积 = 5
result = 8 × 5 = 40
这样每个位置只需要:
prefix product × suffix product
面试官追问
面试官继续问了两个典型问题。
1 能否使用除法?
候选人回答:
如果允许使用除法,可以先计算:
total_product = 所有元素乘积
然后
result[i] = total_product / nums[i]
但如果数组里有 0,这个方法就会出问题。
因此面试官提示:
Assume division is not allowed.
2 时间复杂度是多少?
候选人解释:
构建 prefix product 一次遍历
构建 suffix product 再一次遍历
因此整体复杂度:
Time Complexity: O(n)
Space Complexity: O(n)
随后候选人进一步补充:
其实 suffix 乘积可以在第二次遍历时动态计算,因此可以把空间优化到:
O(1) extra space
面试官表示这个回答很好。
面试评价
这道题是一个非常经典的面试题,很多公司都会考,例如:
- Facebook / Meta
- TikTok
- AppLovin
难点其实不在算法本身,而在 面试中的表达过程:
候选人需要:
- 先给出朴素解法
- 主动分析复杂度
- 再提出优化方案
- 解释为什么不能用除法
- 最后给出复杂度分析
整个过程如果表达清晰,基本就是一个 strong hire 的表现。
csoahelp 面试辅助
很多候选人其实都会做这道题,但在真实面试中仍然容易失败,例如:
- 思路表达混乱
- 没有先说 naive solution
- 没有分析复杂度
- 写代码速度太慢
在 csoahelp 的面试辅助中,我们会:
- 实时帮助候选人梳理解题思路
- 提供算法提示
- 辅助完成代码实现
- 同时支持系统设计和八股问题
如果你即将参加:
- TikTok
- Meta
- AppLovin
- Stripe
等公司的技术面试,可以联系 csoahelp 获取帮助。
如果你最近有 VO 面试,提前准备这些 真实题型和思路,会非常关键。
我们也有代面试,面试辅助,OA代写等服务助您早日上岸~

