Google 面试真题:设计一个支持冷却机制的广告投放系统– VO help – 转码 – 代面试 – 一亩三分地 – 大厂面经 -面试 面经

这次分享一道 Google 的 Coding 面试真题。题目围绕广告投放系统(Ad Server)展开,从基础的广告优先级选择,到加入不同广告的冷却时间,主要考察数据结构设计、状态维护以及动态调度逻辑。

Part 1: Basic Ad Server

Design an AdServer class with two APIs:

  • InsertAd(content, score): Insert a new advertisement with a score.
  • GetAd(): Return the best eligible advertisement.

Requirements:

  1. Always select the ad with the highest score.
  2. Never return the same ad twice consecutively.
  3. After an ad is served, decrease its score by 1.

Part 2: Ad Cooldown / Delay

Extend the existing implementation to support:

  • InsertAd(content, score, delay)
  • GetAd() (remains unchanged)

Additional requirements:

  1. delay specifies how many other ads must be served before the same ad can be served again.
  2. Each ad can have a different delay.

设计一个广告投放系统 AdServer,支持插入广告和获取当前最合适的广告。

第一部分:基础广告系统

系统需要提供两个接口:

  • InsertAd(content, score):插入一条广告,并设置初始分数。
  • GetAd():返回当前符合条件且分数最高的广告。

每次获取广告时,必须选择分数最高的可用广告,但不能连续两次返回同一条广告。同时,一条广告每被投放一次,其分数就减少 1。

第二部分:广告冷却机制

现在为每条广告增加一个 delay 参数。

delay 表示某条广告投放后,必须先投放多少条其他广告,才能再次投放该广告。不同广告可以设置不同的冷却时间。

例如,广告 A 的 delay = 2,那么 A 被投放后,必须先投放两条其他广告,A 才能再次参与选择。

第一部分看起来是简单的最大值选择,但由于广告分数会动态变化,而且不能连续投放同一条广告,直接维护一个最大值并不能解决问题。

一种常见思路是使用最大堆(Max Heap)管理广告分数,同时记录上一条投放的广告。每次选择时,需要跳过当前不符合条件的广告,选出分数最高的可用广告,再更新其分数和状态。

第二部分是这道题真正需要注意的地方。

加入 delay 后,系统不仅需要维护广告的分数,还需要追踪每条广告何时能够重新参与投放。

这里的关键是:冷却时间并不是实际经过的秒数,而是其他广告被投放的次数。

因此,可以考虑使用投放序号来维护每条广告的下一次可用位置,将广告分为可投放和冷却中的两类。

面试中比较容易出错的地方包括冷却计数的边界条件、多个广告分数相同时的选择、广告分数降低后的优先级调整,以及所有广告都处于冷却状态时如何处理。

尤其需要注意,不能为了跳过冷却期而忽略最高分规则,也不能把一次未成功的 GetAd() 调用当作一次有效投放。

这道题的难点不在代码量,而在于如何让多个动态规则同时成立,并且保证每一次选择的正确性。

总结

Google 这道题采用了比较典型的递进式设计:先实现基础功能,再引入新的业务约束,观察候选人能否在已有设计上合理扩展。

对于这类题目,除了熟悉 Heap 等数据结构,更重要的是提前明确状态变化、边界条件和规则之间的关系。

csoahelp 持续整理 Google、Apple、Stripe 等公司的真实技术面试题目,同时提供 Mock Interview 和面试实时文本辅助服务,帮助求职者熟悉英文技术面试的节奏、梳理解题思路,并练习如何清晰地向面试官表达自己的方案。

我们也有代面试,面试辅助,OA代写等服务助您早日上岸~

Leave a Reply

Your email address will not be published. Required fields are marked *