字节跳动 抖音电商 后端日常实习一面面经
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
一、自我介绍 / 基本情况
- 自我介绍
- 为什么大四有比较长的实习时间?
- 后续留学的计划是什么?
- 能保证多久的实习时间?
- 上一段实习了多久?
二、实习相关
三、AI 相关
- 平时使用哪些 AI 工具?
- 日常开发、学习中怎么使用 AI?
- JEV 了解吗?
四、基础问题
- 如何自己实现 Shuffle?给一个数组,如果不能直接调用 shuffle,让你自己实现随机洗牌,会怎么做?
- 追问:具体怎么随机?这个过程执行多少次?时间复杂度是多少?怎么保证元素能够充分打散?怎么保证头部元素也有机会移动到尾部?
- 递归 vs 非递归实现有什么区别?哪一种更容易理解、更容易调试?空间开销和效率有什么区别?什么场景更适合递归?
五、手撕算法
二叉树右视图(LeetCode 199):给一棵二叉树,假设站在树的右侧,要求按照从上到下的顺序输出能够看到的节点。需要 ACM 模式:定义 TreeNode、写函数、构造测试 case、本地运行验证。
六、反问
- 部门主要做什么业务?
- 工作地点在哪里?
- 后续面试流程大概需要多久?
《参考解析》
- 自己实现随机洗牌:标准答案是 Fisher-Yates(Knuth shuffle)。从后往前遍历,对位置
i生成j = random(0, i),交换nums[i]和nums[j]。这样每个位置上的元素是从「剩余未处理区间」里等概率抽出来的,每种排列的概率都是1/n!。- 为什么不是「每次随机挑两个下标交换」:那样做相当于在排列空间上做随机游走,n 次交换远不足以覆盖 n! 种排列,分布有明显偏差(有些排列被生成的次数是 0)。
- 为什么不是「从前往后,每次和 [0, n-1] 全范围随机交换」:这是常见错解,会产生
n^n条等概率路径映射到 n! 个结果,无法整除,必然有排列概率偏高。 - 复杂度 O(n) 时间、O(1) 额外空间;n 次交换,每个元素都被处理一次。要点是对
j取[0, i]闭区间而不是[0, i),取开区间会让最后一个元素永远不动。 - 「怎么保证头部元素也有机会移动到尾部」:因为每轮都可能抽到任意下标,头部元素会被后续的交换带到任意位置,不需要额外处理。
- 递归 vs 非递归:递归代码短、贴合问题定义(树、分治),可读性好;代价是依赖调用栈,深度大时会
StackOverflowError,而且每次调用有栈帧开销、调试时栈很深不容易看。迭代要自己维护显式栈或队列,代码长一些但空间可控(可以放在堆上)、便于加断点观察状态。DFS 遍历树用递归更自然;深度可能很大的场景(链表递归、超深树)或需要精确控制内存时要改成迭代;另外尾递归优化在 JVM 上不生效,别指望编译器兜底。 - 二叉树右视图(LC 199):两种常规解法。BFS 层序遍历,每层取最后一个节点——直观,空间是 O(宽度)。DFS 优先走右子树,用「深度」做判据:第一次到达某个深度时记录当前节点,因为是先右后左,第一次到达即该层最右侧节点——空间是 O(高度)。ACM 模式下除了写函数,还要注意读入格式和构造测试用例:至少覆盖空树、只有左子树的单链(右视图就是每层唯一节点)、只有右子树、以及左右都有但高度不同的情况。
- AI 工具那部分怎么答:面试官想听的是「你有没有把它用在真实问题上」以及「你知不知道它的边界」。可以举具体场景:用它生成样板代码、写单测、解释报错栈、做代码 review 的第一遍筛查;同时说清哪些环节不会交给它——涉及线上数据的变更、权限和金额逻辑、以及结论需要可追溯的场景。有自己写 Agent 或工具链的经历会明显加分,因为这个岗位本身就在 AI 方向。