🚨 insert、delete、search、getRandom 都要 O(1)?别说写,听懂就已经算你稳了
🚪面试刚开场,面试官一句“Let's do something fun”,我还以为是个简单 warmup,结果直接甩来一道 TikTok 面试杀手级算法题。
全程高能,没有废话,代码不是重点,你讲得出 tradeoff、设计逻辑、还能抗住追问,才是通关密钥。
所以今天这篇不整虚的,直接还原 TikTok 真·实·远·程 技术面,一道“基础得离谱、细节卷到爆”的数据结构题,看看到底什么才叫:你有了,但不完全有。

👇 先上原题。
🎯 面试题原文(英文)
Design a data structure that supports insert, delete, search and getRandom in constant time.
⏱️ 面试流程全拆解
- 前3分钟轻聊状态:项目经历 + 面试节奏。
- 第4分钟暴击开题:无套路直给题,没准备就是当场暴毙。
- 5~30分钟边写边讲:你写的不只是代码,是思维展开图。
- 30~40分钟灵魂拷问:如何扩展?抗高并发?数据不一致?
- 最后5分钟靠反问拿好感:对公司业务/技术提问能给你加 buff。
🧠 这题考的根本不是写代码,而是设计思维
TikTok 系列公司一贯爱问你如何在实际业务中搞定高频操作的效率问题。这题虽小,考的东西却不少:
- 真能做到所有操作 O(1) 吗?靠什么?
- 多个相同值怎么存?
- 随机取值靠啥?map 怎么维护?
- delete 操作要不要处理位置交换?
你一旦写得糊涂,就容易被面试官抓着问个底儿掉。
🧰 正解数据结构组合拳(核心设计思路)
我们需要同时保证:
insert(val)
O(1)delete(val)
O(1)search(val)
O(1)getRandom()
O(1)
靠啥?靠这三件法宝:
ArrayList<Integer>
:用来 O(1) 添加、删除末尾元素,也方便 getRandom。HashMap<Integer, List<Integer>>
:存每个值的所有下标,支持重复元素。Random
:用于生成随机下标。
🔧 代码核心片段

🕵️ 面试官怎么追问的?几个高频挑战一定会被问到
❓ 为什么用 List<Integer>
而不是 Set<Integer>
存 index?
因为 List
保序、支持重复、且我们只操作尾部,能做到 O(1)。Set 的话不好维护交换后的位置。
❓ 如何支持高并发、千万级数据?
- 用尾部操作规避频繁移动
- delete 使用 swap 减少开销
- 可以考虑 segment 分块、LRU cache 结构提升局部性
🧩 这场面试的三个精华 takeaway
✅ 1. 写得对没用,你得讲得出设计动机
比如 insert 用 list,delete 要交换尾部,你能不能讲出这样做是为了节省时间复杂度?
✅ 2. delete 是难点,map 的同步更新容易写错
随机性依赖 list 顺序,一旦 index 不一致,就彻底乱套。
✅ 3. 面试不是背题,是现场推演 + 应变
面试官的提问都是在模拟真实开发:功能迭代、数据扩展、容错逻辑、极限测试。
🎬 结尾彩蛋:候选人结尾反问,反而拉高好感度
“我很好奇 TikTok 的推荐缓存是否也有类似的数据结构场景?比如热榜策略?”
面试官一愣,笑着点头:“这个问题问得好。我们确实有一套微服务缓存框架……”
✅ 会写题是基础,会提问是加分。
经过csoahelp的面试辅助,候选人获取了良好的面试表现。如果您需要面试辅助或面试代面服务,帮助您进入梦想中的大厂,请随时联系我。
If you need more interview support or interview proxy practice, feel free to contact us. We offer comprehensive interview support services to help you successfully land a job at your dream company.
