目录
正在加载目录...

Tiktok面经 26 ng 三轮面试已过版 带解答 | Tiktok 一亩三分地 辅助面经分享

分享下 Tiktok面经,三轮技术面,都是亲身经历,这次Tiktok面试给我的直观感受是:题目本身并不难,甚至不算刁钻,但整个流程非常值得参考。流程是 HR 面加三轮lark技术面,原本安排了 OA,但后来被直接跳过(简历优秀,Tiktok是可以跳过OA的),直接进入面试环节。

中途还因为 recruiter 调度问题,三轮技术面整体顺延了一周,这种情况在美国 tech 招聘里其实并不少见,不用太焦虑 技术面整体考察的重点非常清晰,几乎都围绕真实业务场景展开。

Tiktok面试时间线

Tiktok的面试,一亩三分地里有很多时间线,这里分享下我们面试到offer的时间线。

12.15 hr联系约一面(晚上十点半加的我🙂‍↕️)
12.13 一面(一周后约二面)
中间放假休息
1.13 二面
1.15 三面

Tiktok面经 第一轮

题目是leetcode981,直接复制粘贴leetcode题目上来的,非常nice,这种题面都不需要问Clarify question了。最主要的是Follow up,题目大意是实现一个基于时间的key-value map。Set就是在给定时间设置对应的key-value. get需要返回给定时间前最接近他的相同key对应的value,如果没有就返回空字符串. 根据题目很明显我们可以维护一个字典,key就是输入的key,value是list of tuple。Tuple里面存储插入的(val, timestamp)。因为Set的时间是严格升序的,所以每一个key对应的list一定是按照timestamp升序的,因此查找的时候直接上二分就行。

Follow up:如果set的时间不是严格升序的如何处理。现在我们不能直接用二分查找,因为此时的list并不是按时间顺序插入元素的。当时给的思路是使用python的sortedlist,他可以用bisect_left方法在log的时间内找到插入位置,从而获得小于他且最接近的元素。面试官要求不能用python的库,所以上了bst(其实应该avl,但是手写avl的旋转操作不太现实)。

Tiktok面经 第二轮

15min Redis / 锁 八股文相关

1)Redis 分布式锁和乐观锁分别是什么?

回答:分布式锁是跨进程/跨机器的互斥机制,通常用 SET key value NX PX + 唯一 token + Lua 释放保证“加锁/解锁原子性”。乐观锁是“更新时校验版本”,常见是 CAS/版本号,冲突时重试,不提供互斥、但能避免加锁开销。

2)悲观锁和乐观锁区别?

悲观锁是假设冲突高,进入临界区前先阻塞别人;乐观锁是假设冲突低,先并发执行,提交时检测冲突,失败重试。

3)ToC 超大流量场景下,用分布式锁要额外考虑什么?

锁会放大热点 Key 的单点压力,需要做分段锁/令牌桶/排队削峰,并控制锁粒度与 TTL,防止锁竞争导致 RT 飙升。还要考虑续租、超时、抖动、降级,比如失败快速返回、读多写少用本地缓存/副本分担。

4)什么是分段加锁?

把一个热点资源拆成多个 shard(比如 lock:sku:123:{0..N-1}),请求按 hash 落到不同段,降低同一把锁的竞争;最终一致性靠分段汇总或按业务保证同段互斥即可。

5)热点 key 怎么分散到不同节点?

写场景:热点 key 拆分(按用户/订单/分段),再用一致性 hash 或 cluster 槽位分散到不同节点;读场景:可以做多副本/本地缓存,读走副本或本地,写再异步更新。

6)介绍 Redis Cluster 的分片和主从复制

Cluster 用 16384 hash slots 做分片,key 通过 CRC16 映射到槽位分配到不同 master;节点之间用 gossip 维护拓扑和故障信息。每个 master 可挂 slave 做复制,故障时可提升 slave 成 master。

7)Redis 慢查询可能是什么原因?

常见是 大 key / 大 value 导致操作耗时、慢命令(如 keys、smembers 大集合)、CPU 打满、AOF/RDB fork 抖动、以及网络抖动/带宽拥塞导致端到端变慢。

8)怎么判断是网络问题还是 key 设计不合理?

一看 Redis 侧:SLOWLOGlatency doctorINFO commandstats/memory 是否出现慢命令/大 key;二看网络侧:客户端到 Redis 的 RTT(ping/tcping)、丢包、连接重传,以及同机房/跨机房对比。若 Redis 执行耗时低但端到端高,多半是网络或连接池排队。

15min MQ / 缓存 / 设计模式 / 网络

1)消息队列消费者或容器宕机,怎么保证数据一致性?

队列侧靠持久化与重试/重投递保证消息不丢;消费侧靠至少一次语义 + 幂等(唯一业务 key、去重表/状态机)保证重复不出错。必要时用事务消息/Outbox保证“本地事务 + 发消息”一致,失败可补偿重放。

2)缓存穿透怎么解决?布隆过滤器原理?

穿透是大量请求打到不存在的数据,绕过缓存直击 DB。布隆过滤器用 多个哈希函数 + bitmap 记录“可能存在”,不存在则一定不存在,能挡掉绝大多数无效请求;配合“空值缓存 + 限流”更稳。

3)说几个设计模式和应用场景。

单例:全局配置/连接池;策略:不同计费/路由规则可插拔;责任链:登录鉴权/过滤器链;模板方法:统一流程骨架、子类填充差异步骤。

4)Spring 中有哪些经典设计模式?

工厂(BeanFactory/ApplicationContext 管理对象创建)、代理(AOP 动态代理增强事务/日志/权限)、模板方法(JdbcTemplate)、观察者(事件机制 ApplicationEvent)。

5)代理模式怎么实现增强?

代理对象包装目标对象,对外暴露同样接口;方法调用先进入代理,在调用目标方法前后插入增强逻辑,Spring AOP 常用 JDK 动态代理或 CGLIB。

6)浏览器输入 URL 到页面展示的过程?

先 DNS 解析拿到 IP,再建立 TCP/TLS,然后发起 HTTP 请求;服务端处理后返回 HTML,浏览器解析 DOM/CSSOM,执行 JS,构建渲染树并绘制。底层链路还涉及 ARP 找网关 MAC、IP 路由转发、以太网帧传输等。

7)你的技术学习路径是什么?

先用文档/博客建立框架,再通过源码抓关键机制,最后用压测和线上问题复盘验证理解,形成自己的 best practice。

算法题: 员工到食堂最近距离之和

题目:已知每个员工的位置和每个食堂的位置,求每个员工到食堂最近距离之和。
把食堂位置排序;对每个员工位置用二分找到最近的两个食堂(lower_bound 左右邻居),取距离最小累加即可,时间复杂度 O((N+M)logM)

Tiktok面经 第三轮

实习项目

  • 业务细节询问,用户群体和规模,qps,覆盖程度
  • 挑一个指标问了怎么实现的,是自己的想法还是带教指导下完成的,在这个过程中有没有自己的思考

场景题

  1. 计算文本中一个字符串出现的次数,由于文本太小的原因,这个文本无法一次读取到内存中
    • 比较经典的场景题,主要的问题是解决大数据量处理
    • 因为没法一次写入内存,所以需要分块,但分块的话要考虑边界问题,就是目标字符串可能会被分到两个块中,比如 xiaohongshu,被分成第一块结尾是 xiaohong 第二块结尾是 shu
    • 这种情况下可以用重叠读的方式,每次都读 N 字节到缓冲区,下一次读取的时候,指针不向前 N 位,而是向后 N-(目标字符串-1) 位
    • 之后还需要考虑效率问题,有两个可以优化的点,一个是设置合理的缓冲区对 I/O 优化,另一个是选择匹配算法上,根据目标文本的大小,如果太大了,可以考虑用 KMP 算法
  2. 如果 tiktok 上某个大 V 突然发了一个视频,1 秒内产生了 100 万次点赞,你的计算节点出现了倾斜,导致该节点 CPU OOM,你会怎么做
    • 给了五分钟思考时间,我大概从探测和治理两方面回答
    • 探测:做局部的采样统计,在每个计算节点维护一个小的 hashmap,处理 10000 跳数据扫一次,如果发现某个视频 id 占比超过一定阈值,就判定为热点,这样做可以节省开销。后面还聊到可以让视频发布的时候,就提前在业务侧标记粉丝很多的大 V(还举了野兽先生的例子 hh),打上潜在热点视频的标记
    • 治理:探测到的热点 id 加盐打散,路由到其他节点,之后再汇总
    • 最后再聊点老生常谈的限流降级,加 ttl

八股

  • redis 持久化(AOF,RDB 快照,混合)
  • redis 大 key 对持久化会有什么影响(对 AOF 的影响会阻塞重写阶段,对缓冲区和磁盘 I/O 的效率也有影响,对 RDB 的话主要影响 bgsave 的 fork())

一些比较宏观的问题

  • 实习中有遇到什么压力吗,是怎么解决的
  • 聊到了一个小事故,后面又聊到压测,就讲了下怎么做压测的,大框架还是【发现问题-工具排查-解决问题-复盘优化】的思路
  • 读研的研究方向,为什么学后端

代码题

给定一个由一些数字(1-9)组成的集合 digits(不包含 0),以及一个正整数 n,请你使用 digits 中的数字,组成一个小于 n 的最大整数。集合中的每个数字可以使用任意次。

示例 1:输入:digits = [1,2,4,9], n = 2533
输出:2499

解题思路

import bisect

m = int(input().strip())
numbers = list(map(int, input().split()))
number_set = sorted(set(numbers))  # 等价于 C++ set
limit = input().strip()

max_digit = number_set[-1]

for i in range(len(limit)):
    cur_digit = int(limit[i])

    # 到最后一位,或者当前位不在可用数字集合中
    if i == len(limit) - 1 or cur_digit not in number_set:
        while i >= 0:
            cur_digit = int(limit[i])
            idx = bisect.bisect_left(number_set, cur_digit)

            # 找到小于 limit[i] 的最大数字
            if idx > 0:
                chosen = number_set[idx - 1]
                # 前缀 + 当前位替换 + 后面全填最大值
                print(
                    limit[:i] +
                    str(chosen) +
                    str(max_digit) * (len(limit) - i - 1)
                )
                break
            i -= 1

        # 所有位都无法匹配,只能缩短一位
        if i < 0:
            print(str(max_digit) * (len(limit) - 1))

        break

Tiktok HR面

HR面,感觉难度最低(不知道为什么很多人都说字节hr面最难)也深挖了一部分简历,问了岗位相关的专业问题,但总体来看都没前两轮问的深。还会问一些个人性格,实习期望,职业规划等一类的通用问题。个人感觉只要前两轮都能通过的话,这一轮很轻松就能完成。

了解更多

字节总体感受是节奏比较快速,面试官水平比较高,看起来比较年轻,沟通起来顺畅,hr反馈比较及时,薪资给的中上,周期很快,不到2个月就可以走完流程,目前是三面通过状态,还在等流程。

Interview Aid 专注北美技术岗位的面试辅助,如果你近期也拿到Tiktok的面试,可以与我们联系,我们免费提供Tiktok OA真题和 Tiktok面经 参考。

正文完