偏移量分页参数转换为页码分页参数的算法实现方案
解决方案
前置校验建议
你可以先对入参limit做最大值校验,限制limit <= 100,和上游page_size的最大值对齐,即可保证所有场景下都可以通过单次请求覆盖需要返回的所有数据。如果业务需要支持更大的limit,可拆分多次请求上游后合并结果即可。
核心实现逻辑
无需复杂的因子计算或遍历操作,仅通过3步简单算术运算即可得到最优请求参数,同时保证拉取的数据量最小:
- 确定
page_size取值:优先取能够覆盖所需全部数据的最小页长,即offset + limit,如果该值超过上游最大page_size限制100,则直接取100即可 - 计算
page_number取值:用向下取整除法计算page_number = offset // page_size,保证请求的页起始位置小于等于目标offset - 结果过滤:上游返回数据后,按偏移量截取所需片段返回即可
可直接落地的代码示例
# 上游page_size最大值,可根据上游实际限制调整 MAX_UPSTREAM_PAGE_SIZE = 100 def transform_params(offset: int, limit: int) -> tuple[int, int, int, int]: # 可选:入参校验,限制limit不超过最大值 if limit > MAX_UPSTREAM_PAGE_SIZE: raise ValueError("limit最大不能超过100") # 计算最优page_size page_size = min(MAX_UPSTREAM_PAGE_SIZE, offset + limit) # 计算page_number page_number = offset // page_size # 计算结果截取的起止位置 start_slice = offset % page_size end_slice = start_slice + limit return page_number, page_size, start_slice, end_slice
典型场景验证
我们可以通过几个常见边界场景验证方案正确性:
- 场景1:入参
offset=5,limit=10,需要返回下标5~14的数据- 计算得
page_size=15,page_number=0 - 上游返回014共15条数据,截取第514位即可,无多余数据浪费
- 计算得
- 场景2:入参
offset=90,limit=10,需要返回下标90~99的数据- 计算得
page_size=100,page_number=0 - 上游返回099共100条数据,截取第9099位即可
- 计算得
- 场景3:入参
offset=120,limit=50,需要返回下标120~169的数据- 计算得
page_size=100,page_number=1 - 上游返回100199共100条数据,截取第2069位(对应原数据120~169)即可
- 计算得
该方案时间复杂度为O(1),仅需基础算术运算即可完成,无需复杂逻辑,所有场景下都能保证请求的数据量最小。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

