TikTok NG SDE 后端 VO 面经 2025-09-12|子集和划分+滑动窗口最大值在 OAVOSERVICE 实时辅助下速通
2025-09-12

这次是 Lark 平台上的视频面试,面试官是国人。整体氛围还可以,前面聊简历,后面直接两道 coding,时间抓得比较紧。在 OAVOSERVICE 实时辅助 下,候选人顺利完成了整个面试流程。我们提供 VO辅助、VO代面、OA代做、OA辅助 服务,更多面经与资源可参考 一亩三分地 的经验板块。
简历问答环节
面试官先让候选者挑一个熟悉的项目,重点问了下面几个角度,大概持续了20分钟:
项目深度挖掘
- 业务目标:这个项目最大的业务目标是什么?对用户或者系统性能的提升在哪里?
- 技术挑战:项目里有没有遇到过并发冲突/数据一致性的问题,怎么解决的?
- 技术选型:为什么选择了当前的消息队列/存储方案?
- 团队协作:在团队中你主要负责哪一块?和其他同学的接口是怎么对接的?
- 性能优化:项目上线后有没有遇到过性能瓶颈,是怎么排查的?
👉 在 OAVOSERVICE 的实时提醒下,候选人能够有条理地回答每个问题,展现了对项目的深度理解和实际工程经验。
Coding 环节
Q1:子集和划分
题目:给定一个整数数组,判断是否能将数组分成两个子集,使得两个子集的和相等。
示例:
Input: nums = [1,5,11,5]
Output: true(因为可以分成[1,5,5]和[11])
考点:典型0/1背包动态规划。
解题思路
- 首先计算数组总和,如果总和为奇数,直接返回false
- 如果总和为偶数,问题转化为:能否找到子集使其和为总和的一半
- 使用0/1背包DP:dp[i][j]表示前i个元素能否组成和为j的子集
- 状态转移:dp[i][j] = dp[i-1][j] || dp[i-1][j-nums[i-1]]
代码实现
def canPartition(nums):
total = sum(nums)
if total % 2 != 0:
return False
target = total // 2
dp = [False] * (target + 1)
dp[0] = True
for num in nums:
for j in range(target, num - 1, -1):
dp[j] = dp[j] or dp[j - num]
return dp[target]
Q2:滑动窗口最大值
题目:给定一个数组 nums 和一个窗口大小k,返回每个窗口中的最大值。
示例:
Input: nums = [1,3,-1,-3,5,3,6,7], k=3
Output: [3,3,5,5,6,7]
解题思路
- 使用双端队列(deque)维护窗口内的元素索引
- 队列中存储的是可能成为最大值的元素索引
- 当新元素加入时,移除队列中所有小于新元素的元素
- 当窗口滑动时,移除超出窗口范围的元素
代码实现
from collections import deque
def maxSlidingWindow(nums, k):
if not nums or k == 0:
return []
dq = deque() # 存储索引
result = []
for i in range(len(nums)):
# 移除超出窗口的元素
while dq and dq[0] <= i - k:
dq.popleft()
# 移除所有小于当前元素的元素
while dq and nums[dq[-1]] <= nums[i]:
dq.pop()
dq.append(i)
# 当窗口大小达到k时,记录最大值
if i >= k - 1:
result.append(nums[dq[0]])
return result
面试总结
整体写完以后都挺满意的,很顺利!这次面试展现了以下亮点:
- 项目经验丰富:能够深入讨论技术细节和业务价值
- 算法基础扎实:快速识别经典问题并给出最优解
- 代码实现清晰:思路明确,代码结构良好
- 沟通表达流畅:能够有条理地解释解题思路
备考建议
- 项目准备:深入理解项目的技术选型和业务价值
- 算法练习:熟练掌握DP、滑动窗口等经典算法
- 代码质量:注重代码的清晰度和边界条件处理
- 模拟面试:提前练习技术表达和问题回答
大家有搞不懂的随时dd,我们提供专业的 OAVO辅助 服务,包括真题 mock 和实时面试指导,帮助你在面试中发挥最佳水平!