上周刚结束了和TikTok的一轮远程技术面,心跳现在才算勉强平复。和传说中的一样,字节系的面试节奏很快,不拖泥带水,问题看起来家常,但每个提问都像是在探你的底。现在趁着记忆还热,把那道让我差点翻车的算法题和当时的心路历程分享出来,希望能帮正在刷题的你绕开一些坑。
面试官是个看起来很干练的工程师,寒暄两句就直接在共享编辑器里贴出了题目,氛围瞬间就有了强度。
Given an array of positive integers nums and an integer k, return true if nums has a continuous subarray whose sum equals to k.
说实话,看到题目的第一秒,我心里甚至闪过一丝窃喜,这不是经典题型吗?但很快我就意识到,在TikTok的面试里,越是看起来熟悉的题目,水可能越深。面试官不是在等你默写答案,而是在观察你解题的整个思维链条。
我的第一反应几乎是本能的,暴力解法,两层循环,找出所有连续子数组求和再判断。但这个念头只在脑子里停留了零点五秒就被我掐灭了。直接说这个思路,等于把“我不懂优化”写在脸上,时间复杂度O(n²)的表现基本就是“感谢参与”的信号。
我稳了稳心神,对面试官说,暴力解法显然不是最优的,既然题目强调了“连续子数组”和“正整数”,这其实是给了很强的信号。这两个条件组合在一起,简直就是为“滑动窗口”算法量身定做的。我能感觉到面试官在屏幕那头微微点头,他等的正是这个。
接下来的沟通就顺畅多了。我没有急着写代码,而是把我的思路“说”了出来,就好像在和他进行一次方案探讨。我把这个过程描述成一个在数组上滑动的“尺子”,尺子的左端和右端就是两个指针。右边的指针负责向右探索,把新的数字纳入“窗口”,并累加求和。一旦窗口内的总和超过了目标值k,左边的指针就必须向右移动,把“旧”的数字扔出窗口,给总和“减负”。这个窗口就这样一伸一缩地向右滑动,我们要找的,就是窗口总和恰好等于k的那个瞬间。
讲完思路后,我才开始写代码。整个过程非常流畅,但写到最后,我特意停下来补充了一句,对于一些边界情况需要处理,比如如果输入的数组是空的,应该直接返回False,否则程序可能会出错。这一个小小的补充,其实是展示你代码鲁棒性的关键,也正是那张截图里assert hasSubarraySumToK([], 6) == False
测试用例的意义所在。
最终代码写完,面试官没有再追问更深的优化,只是围绕这个解法的时间复杂度(O(n))和空间复杂度(O(1))聊了几句就结束了。
复盘整个过程,我感觉TikTok的面试非常看重候选人从问题到最优解的思考路径。他们想看的不是你记住了多少题,而是你分析问题、识别模型、并严谨实现的能力。对于这类看似简单但需要优化手法的题目,千万不要满足于写出正确答案,主动展现你的思考深度和对边界情况的把控,才是真正能让你加分的地方。
希望这次的经历能对你有用,祝各位在求职路上的朋友,都能在下一次“心跳”面试中,稳稳拿下。
本文的作者 石老师,在这里给大家打个硬广,csoahelp.com每日分享北美大厂面经,小红书也有更新,我们还提供种类多样的收费服务协助您进入北美科技大厂,有意向的微信扫码联系我,或者也可以通过其他方式联系我
