最近很多同学在准备 Block(Square / Cash App)的 Engineer 面试,这家公司非常喜欢 数据结构 + 图结构 + 关系推荐 组合题。
这次给大家拆解一道真实出现过的题目,包含完整英文原题 + 思路还原 + 最终逻辑结构。
整篇文章不包含任何个人隐私,仅从技术角度帮你理解题目和提升面试能力。
🔵 一、完整英文原题(原文必须保留)
Assume we have a database table that records friendship and mutual “like” counts between users.
Columns:
UserA | UserB | likesAtoB | likesBtoA
Example Rows:
Jack | Rachel | 5 | 3
Mark | Ellen | 3 | 1
Rachel | Ellen | 6 | 4
Jack | Mark | 0 | 6
Mark | Rachel | 1 | 1
Task 1 – Transform Data Structure
Design a data structure that efficiently supports queries such as:
“How many times did User A like User B?”
Task 2 – Find Each User’s “Best Friend”
Definition:
A user’s best friend is the one who liked their content the most.
Example:
Jack liked Rachel 5 times → Rachel is Jack’s best friend.
Task 3 – Recommend “Potential Friend”
Definition:
For each user, find their best friend’s best friend,
but exclude:
- The user themselves
- Users already in the user’s friend list
Output format:
User X’s potential friend is Y
🔵 二、题目到底要考什么?
这道题看似像“社交关系”业务逻辑,实际上考点非常明确:
✔ 1. 如何把原始表结构转成可查的数据结构
通常用:
Map<String, Map<String, Integer>>
存储 likesAtoB。
✔ 2. 如何寻找“最大值对应的人”
也就是 best friend 的定义。
✔ 3. 如何处理链式推荐、排除规则
Best friend → best friend’s best friend
并且要过滤掉:
- 自己
- 已经认识的人
✔ 4. 是否会处理环、重复、无解等情况
这一点非常容易被问 Follow-up。
🔵 三、从头构建解决方案(过程型讲解)
Step 1:将数据库表转成嵌套字典
输入的数据看起来像这样(来自你上传的 pdf 和文本材料):
目标是转成:
likes["Jack"]["Rachel"] = 5
likes["Rachel"]["Jack"] = 3
...
这样就能在 O(1) 时间查 likesAtoB。
Step 2:寻找每个人的“Best Friend”
算法:
- 对每个用户遍历所有出边(Ta → Friend)
- 找出 likes 最大的那个人
- 记录到一个 bestFriend 映射表里
最终结果类似:
Jack -> Rachel
Rachel -> Ellen
Mark -> Ellen
Ellen -> Rachel
(示例,不同输入可能不同)
Step 3:寻找每个用户的「Potential Friend」
逻辑来自原题:
best friend’s best friend,排除自己和已有好友。
举例:
- Jack 的 best friend 是 Rachel
- Rachel 的 best friend 是 Ellen
- Ellen 不是 Jack 自己
- Ellen 不是 Jack 的好友(如果不是)
→ Jack 的 potential friend = Ellen
最终输出类似:
Jack’s potential friend is Ellen
Mark’s potential friend is Rachel
Rachel’s potential friend is Jack
...
每个人都能按链路找到推荐人。
🔵 四、常见 Follow-up 问题(面试必问)
Block 非常喜欢在最后问一些“扩展性”问题,比如:
❓1. 如果 best friend 有平手(tie)怎么办?
建议回答:
- 按字典序、按用户 ID、或按最早出现顺序
- 关键是:定义清楚即可
❓2. 如果形成环怎么办?
如:A → B → A
可以直接允许,不影响结果;
Potential Friend 会在过滤中排掉自己的情况。
❓3. 如何优化性能?
- 给 likesAtoB 做缓存
- 预先计算 best friend 映射
- 使用 adjacency list 加快访问
- 若数据量大,可考虑分片或 redis
这类回答非常加分。
这道题很经典,非常适合判断:
| 能力 | 是否被测试到? |
|---|---|
| 数据结构建模 | ✔ |
| 图遍历 & 最大值查找 | ✔ |
| 多级关系推荐 | ✔ |
| 去重过滤逻辑 | ✔ |
| 可扩展性思维 | ✔ |
几乎完整覆盖 Block 的考点风格。
如果你正在准备
Square / Cash App / Stripe / Google / Meta 的面试,
需要:
- 真题拆解
- Live coding 演练
- 高频题库
- 全流程模拟
我们专注北美 科技公司面试,
提供真题还原、代码思路引导、面试流程模拟等支持。
➡️ 可以联系 CSOAHelp(我们提供高质量 OA/VO 面试辅助与全流程解析)。

