面灵AI→

字节跳动 抖音电商 后端日常实习一面面经

轮次
一面
时间
2026-09
来源
牛客网

《面试题目》

一、自我介绍 / 基本情况

  1. 自我介绍
  2. 为什么大四有比较长的实习时间?
  3. 后续留学的计划是什么?
  4. 能保证多久的实习时间?
  5. 上一段实习了多久?

二、实习相关

三、AI 相关

  1. 平时使用哪些 AI 工具?
  2. 日常开发、学习中怎么使用 AI?
  3. JEV 了解吗?

四、基础问题

  1. 如何自己实现 Shuffle?给一个数组,如果不能直接调用 shuffle,让你自己实现随机洗牌,会怎么做?
  2. 追问:具体怎么随机?这个过程执行多少次?时间复杂度是多少?怎么保证元素能够充分打散?怎么保证头部元素也有机会移动到尾部?
  3. 递归 vs 非递归实现有什么区别?哪一种更容易理解、更容易调试?空间开销和效率有什么区别?什么场景更适合递归?

五、手撕算法

二叉树右视图(LeetCode 199):给一棵二叉树,假设站在树的右侧,要求按照从上到下的顺序输出能够看到的节点。需要 ACM 模式:定义 TreeNode、写函数、构造测试 case、本地运行验证。

六、反问

  1. 部门主要做什么业务?
  2. 工作地点在哪里?
  3. 后续面试流程大概需要多久?

《参考解析》

  1. 自己实现随机洗牌:标准答案是 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),取开区间会让最后一个元素永远不动。
    • 「怎么保证头部元素也有机会移动到尾部」:因为每轮都可能抽到任意下标,头部元素会被后续的交换带到任意位置,不需要额外处理。
  2. 递归 vs 非递归:递归代码短、贴合问题定义(树、分治),可读性好;代价是依赖调用栈,深度大时会 StackOverflowError,而且每次调用有栈帧开销、调试时栈很深不容易看。迭代要自己维护显式栈或队列,代码长一些但空间可控(可以放在堆上)、便于加断点观察状态。DFS 遍历树用递归更自然;深度可能很大的场景(链表递归、超深树)或需要精确控制内存时要改成迭代;另外尾递归优化在 JVM 上不生效,别指望编译器兜底。
  3. 二叉树右视图(LC 199):两种常规解法。BFS 层序遍历,每层取最后一个节点——直观,空间是 O(宽度)。DFS 优先走右子树,用「深度」做判据:第一次到达某个深度时记录当前节点,因为是先右后左,第一次到达即该层最右侧节点——空间是 O(高度)。ACM 模式下除了写函数,还要注意读入格式和构造测试用例:至少覆盖空树、只有左子树的单链(右视图就是每层唯一节点)、只有右子树、以及左右都有但高度不同的情况。
  4. AI 工具那部分怎么答:面试官想听的是「你有没有把它用在真实问题上」以及「你知不知道它的边界」。可以举具体场景:用它生成样板代码、写单测、解释报错栈、做代码 review 的第一遍筛查;同时说清哪些环节不会交给它——涉及线上数据的变更、权限和金额逻辑、以及结论需要可追溯的场景。有自己写 Agent 或工具链的经历会明显加分,因为这个岗位本身就在 AI 方向。