字节跳动后端开发面经 · 2024 秋招

字节跳动后端开发工程师(抖音电商)2024 秋招完整面经:5 轮技术面 + HR 面,算法题涵盖区间 DP、线段树、K 路归并、一致性哈希,项目深挖与 Go 语言细节。

字节跳动后端开发面经 · 2024 秋招

岗位:后端开发工程师(抖音电商)
背景:985 硕士,Go 语言为主,2 段实习经历
结果:OC,年薪 45w+(Base + 期权)
时间线:8.15 投递 → 8.20 一面 → 9.5 五面 → 9.12 OC


字节面试风格

字节后端面试的特点是:算法难度大、轮次多、项目深挖狠。

  • 算法占比 60%:每轮至少 1 道 hard 或 medium-hard
  • 项目深挖 25%:不只是问"你做了什么",而是问"为什么这样做"、“如果量级翻 10 倍怎么办”
  • 系统设计 15%:中后期轮次出现,侧重高并发场景

一面(8.20):基础 + 算法

面试官:抖音电商某交易服务负责人
时长:65 分钟

算法题 1:最长递增子序列(LIS)

LeetCode 300:最长递增子序列。要求 (O(n \log n)) 解法。

我的思路:

def lengthOfLIS(nums):
    tails = []
    for num in nums:
        # 二分查找,找到第一个 >= num 的位置
        left, right = 0, len(tails)
        while left < right:
            mid = (left + right) // 2
            if tails[mid] < num:
                left = mid + 1
            else:
                right = mid
        if left == len(tails):
            tails.append(num)
        else:
            tails[left] = num
    return len(tails)

追问:

  • “如果要求返回实际的子序列怎么改?” → 用 prev 数组记录前驱节点
  • “如果要严格递减呢?” → 反转或调整比较符号
  • “如果有 10^7 的数据量,tails 数组最大多长?” → 最长递增,最坏全递增,(O(n)) 空间

算法题 2:跳跃游戏 II

LeetCode 45:跳到末尾的最少跳跃次数。

我直接写了贪心:维护当前跳跃能到达的最远位置。

def jump(nums):
    n = len(nums)
    if n <= 1:
        return 0
    jumps, curr_end, farthest = 0, 0, 0
    for i in range(n - 1):
        farthest = max(farthest, i + nums[i])
        if i == curr_end:
            jumps += 1
            curr_end = farthest
    return jumps

追问:“这个贪心为什么是对的?” → 在每一步能到达的范围内,选择下一步能跳最远的位置。

Go 语言基础(15 分钟)

  • GMP 模型:Goroutine、M(OS 线程)、P(逻辑处理器)的关系
  • Channel 底层:有锁(hmutex)、循环数组、sendq/recvq 等待队列
  • Context 源码:如何传递超时和取消信号
  • Go 的 GC:三色标记 + 混合写屏障

二面(8.25):项目深挖 + 算法

面试官:抖音电商核心交易链路负责人
时长:75 分钟

项目深挖(30 分钟)

我实习做的是电商商品服务,面试官从这个切入点开始连环追问:

  1. “商品详情页 QPS 多少?怎么算的?瓶颈在哪?”

    • 实际 QPS 约 2 万,通过压测得出
    • 瓶颈:Redis 缓存读取 + 反序列化
  2. “缓存和数据库不一致怎么处理?”

    • 先更新数据库,再删缓存(Cache-Aside)
    • 追问"删缓存失败怎么办?" → 消息队列异步重试
  3. “如果要求强一致性呢?”

    • 分布式锁 + 双删策略;或用 Read-Through 把一致性交给缓存层
  4. “你的服务依赖了 5 个下游,怎么保证稳定性?”

    • 熔断(Hystrix)、限流(令牌桶)、降级(返回兜底数据)、超时控制
  5. “如果下游全部挂了,你的服务还能提供什么?”

    • 本地缓存兜底 + 返回简化版数据(如只返回商品名称和价格)

算法题:加油站问题变体

LeetCode 134 变体:每个加油站有油量 gas[i],到下一站消耗 cost[i]。求所有可能的起点(不止一个)。

我分析了总油量不足时无解,否则确定的起点唯一。面试官说变体要求所有可能的起点。

思路:将问题转化为环形数组上的差分数组,找到所有累积和不跌破 0 的位置。用前缀和 + 单调队列优化。

因为时间紧,我写了 (O(n^2)) 的暴力,面试官表示理解但希望有更好的方案,讨论了几分钟思路。


三面(8.29):算法 + 系统设计

面试官:抖音电商架构组
时长:80 分钟

算法题:最佳买卖股票时机含冷冻期

LeetCode 309:卖出后有一天冷冻期,不能买入。

状态机 DP:

def maxProfit(prices):
    if not prices:
        return 0
    n = len(prices)
    # hold[i]: 第 i 天持有股票的最大利润
    # sold[i]: 第 i 天刚卖出股票的最大利润
    # rest[i]: 第 i 天处于冷冻期或不操作的最大利润
    hold, sold, rest = -prices[0], 0, 0
    for i in range(1, n):
        prev_hold, prev_sold, prev_rest = hold, sold, rest
        hold = max(prev_hold, prev_rest - prices[i])
        sold = prev_hold + prices[i]
        rest = max(prev_rest, prev_sold)
    return max(sold, rest)

追问:“这个状态机可以压缩到 O(1) 空间吗?” → 可以,当天状态只依赖前一天。

系统设计:电商秒杀系统

要求设计一个支持 10 万人同时抢购 1000 件商品秒杀的系统。

我的回答框架:

  1. 流量分层:CDN → Nginx 限流 → 网关鉴权 → 服务层
  2. 库存扣减:Redis Lua 原子脚本预扣库存
  3. 异步下单:Redis 扣减成功进入 Kafka 队列,消费者异步创建订单
  4. 防超卖:数据库唯一索引做最后一层防线
  5. 读写分离:热点商品信息多级缓存

追问:

  • “如果用户拍了 1000 件但没付款,怎么回流库存?” → 订单超时关闭 + 定时任务回滚库存
  • “怎么防止机器人脚本?” → 请求签名 + 验证码 + 设备指纹
  • “秒杀 URL 怎么防止提前泄露?” → 动态生成 + 时间窗口校验

四面(9.2):跨部门交叉面

面试官:抖音视频推荐服务后端负责人
时长:70 分钟

算法题:区间重叠合并 + 区间覆盖

先做了经典的合并区间(LeetCode 56),然后延伸:

“如何判断一组区间是否能完全覆盖 [0, T]?”

贪心:按起始位置排序,维护当前能覆盖到的最右端点。

def canCover(intervals, T):
    if not intervals:
        return False
    intervals.sort(key=lambda x: x[0])
    covered = 0
    i = 0
    while covered < T:
        max_reach = covered
        # 找所有起点 <= covered 的区间,选最远右端点
        while i < len(intervals) and intervals[i][0] <= covered:
            max_reach = max(max_reach, intervals[i][1])
            i += 1
        if max_reach == covered:
            return False  # 无法继续前进
        covered = max_reach
    return True

系统设计:Feed 流系统

设计抖音这样的短视频推荐系统后端。

我按照召回 → 粗排 → 精排 → 重排的漏斗架构来回答,面试官重点追问了:

  • “如何快速判断用户已经看过的视频?” → Bloom Filter(快速去重) + Redis Set(精确确认)
  • “如果一个视频突然爆火,怎么实时推给更多人?” → 热点探测 + 写扩散到活跃用户 inbox
  • “冷启动用户怎么推荐?” → 基于注册信息的内容召回 + 热门兜底

五面(9.5):HR 面

时长:30 分钟

  • 为什么选择字节?对抖音电商有什么了解?
  • 职业规划:技术深度 vs 广度
  • 现在的 offer 情况,期望薪资
  • 反问:团队技术栈、新人培养机制

HR 面比较轻松,但有一个陷阱问题:

“你有其他 offer 吗?如果字节和阿里同时给你 offer,你怎么选?”

我的回答:先肯定字节技术氛围和产品影响力,再提到会根据业务方向和团队匹配度综合决策。避免直接说"肯定选字节"这种没有信息量的回答。


复盘与建议

字节后端面试通关密码

维度权重准备要点
算法50%LeetCode Hot 100 + 精选 200 题,hard 题必须会
项目25%不能只讲功能,要讲技术决策和 trade-off
基础15%Go 语言底层、MySQL 索引、Redis 原理、网络协议
系统设计10%高并发场景、缓存策略、一致性方案

高频追问准备清单

  1. 你项目中的 QPS/TPS 是多少?压测数据?
  2. 缓存一致性怎么保证?
  3. 服务挂了怎么兜底?
  4. 如果数据量翻 10 倍,哪里会最先成为瓶颈?
  5. 你的技术选型为什么选 A 不选 B?
  6. 这个项目最大的难点是什么?你怎么解决的?

字节风格与其他公司对比

公司面试侧重与字节对比
字节算法重 + 项目挖得深—
阿里项目深度 + 架构思维项目追问类似,算法难度降低
腾讯基础扎实 + 开放性问题算法难度相近,项目深度略低
美团工程实践 + 业务理解更看重业务场景分析能力

祝你面试顺利!字节跳动的技术面确实硬核,但只要算法扎实、项目经得起深挖,offer 是水到渠成的。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页