刚做完一场 Rippling OA ,三题不到二十分钟过完。说实话进去之前没太了解 Rippling 的题风,就当普通 HackerRank 备考。做完之后感觉这套题出得挺有设计感的——三道题各考一个方向:贪心、API 调用、滑动窗口,而且每道都有一个容易忽略的细节。T1 的 64 位溢出、T2 的浮点比较、T3 的收缩条件,任何一个写错了对应的 case 就挂。
把三道题的思路和参考代码记下来,有在备考的直接用。

T1:服务器扩容,最大化总处理量

题意
n 台服务器,每台有 serverCapacity[i] 和 incomingRequests[i],实际能处理 min(capacity, requests)。必须恰好选 k 台,把它们的容量翻倍,求翻倍后全平台能处理的请求总数的最大值。
示例:capacity = [10,4,3,7],requests = [3,10,4,5],k = 2 → 选第 2、3 台翻倍后总和 20。
思路
先算不翻倍时的基础总量,每台 min(cap, req) 累加。再算”若只翻这一台”的增量:min(2×cap, req) – min(cap, req)。把所有增量从大到小排序,取前 k 个加到基础总量上,就是最优解。
注意用 64 位整数防溢出,capacity 和 requests 相乘可能超 int 范围。
参考代码(Python)
def max_throughput(capacity, requests, k):
base = sum(min(c, r) for c, r in zip(capacity, requests))
gains = sorted(
[min(2*c, r) - min(c, r) for c, r in zip(capacity, requests)],
reverse=True
)
return base + sum(gains[:k])T2:REST API——单位价格最高的巧克力

题意
调分页接口 https://jsonmock.hackerrank.com/api/chocolates?brand=...&page=...,在指定品牌下找出单价(price/weight)最高的 productNumber;单价相同则取编号更小的。
思路
按页循环拉全量数据,直到没有下一页。比较单价时用交叉相乘(p1×w2 vs p2×w1),避免浮点误差。维护当前最优单价和对应 productNumber,相等时保留更小编号。
边界要注意:空页、prices/weights 数组长度不一致、data 字段是空数组而不是 null 这几种情况都要处理。
参考代码(Python)
import requests
def best_unit_price(brand):
best_price, best_weight, best_num = -1, 1, None
page = 1
while True:
resp = requests.get(
f"https://jsonmock.hackerrank.com/api/chocolates",
params={"brand": brand, "page": page}
).json()
for item in resp.get("data", []):
for p, w in zip(item["prices"], item["weights"]):
# 交叉相乘比较 p/w vs best_price/best_weight
if (p * best_weight > best_price * w or
(p * best_weight == best_price * w and
item["productNumber"] < best_num)):
best_price, best_weight = p, w
best_num = item["productNumber"]
if page >= resp.get("total_pages", 1):
break
page += 1
return best_numT3:最长「一致」事件子数组

题意
userEvent 为用户 ID 日志。子数组「一致」定义为:子数组里出现次数最多的那个用户的频次,等于整段数组里出现次数最少的用户的全局频次。求满足条件的最长子数组长度。
示例:[1,2,1,3,4,2,4,3,3,4],全局最小频次为 2,最长合法子数组长度 8。
思路
先扫一遍得到全局每个用户频次,取最小值 t。再滑动窗口:右指针扩张,维护窗口内计数;若窗口内任一用户计数 > t,就右移左指针直到重新 ≤ t。全程更新合法窗口的最大长度。
参考代码(Python)
from collections import Counter
def longest_consistent(userEvent):
global_count = Counter(userEvent)
t = min(global_count.values())
window = Counter()
left = 0
max_len = 0
for right, user in enumerate(userEvent):
window[user] += 1
while window[user] > t:
window[userEvent[left]] -= 1
if window[userEvent[left]] == 0:
del window[userEvent[left]]
left += 1
max_len = max(max_len, right - left + 1)
return max_lenFAQ
Rippling OA 用什么平台,多长时间?
HackerRank,通常 60 到 90 分钟,三道题,难度从 Medium 到偏实现类,不出偏门算法。
T1 为什么一定要用 64 位整数?
capacity 最大可能到 10⁹,翻倍后是 2×10⁹,超出 int 范围。Python 默认大整数没问题,Java 和 C++ 要显式用 long。
T2 为什么不能直接用 price/weight 做浮点比较?
浮点除法有精度误差,两个”相等”的单价实际上可能差一个 epsilon,导致答案错误。交叉相乘是标准做法,整数比较没有精度问题。
T3 收缩条件为什么是”窗口内任一用户计数 > t”而不是其他?
因为”一致”的定义是窗口最大频次等于全局最小频次 t。只要有任何一个用户在窗口里出现超过 t 次,这个窗口就不合法,必须收缩左边界直到那个用户的计数降回 t。
Rippling OA 通过之后流程是什么?
通常是 recruiter 电话确认背景,然后安排 2 到 3 轮技术面,偏工程落地和系统设计,风格和纯算法公司不太一样。
这三类题型在其他公司也会出现吗?
会,而且出现频率很高。T1 的增量贪心在亚麻、Walmart 都有类似题;T2 的 REST API 分页在 Expedia、Goldman Sachs 出现过;T3 的滑动窗口变体在 TikTok、Google OA 里很常见。练熟了一套收益不只是 Rippling 一家。
有在准备 Rippling 或其他北美大厂 OA 的同学,可以来找我们聊聊。InterviewShow 整理了各厂高频 OA 题型,按目标公司给针对性刷题清单,有需要的来聊。