You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写函数获取指定数值范围外的数字?

如何实现排除多组数值范围后返回剩余区间的函数

要解决这个问题,核心思路是先整理要排除的区间(合并重叠/相邻的),再和总范围对比找出间隙。下面用Python实现一个通用的函数,步骤清晰,能处理各种边界情况。

步骤拆解

  • 排序并合并排除区间:如果输入的排除区间有重叠或相邻(比如(2,5)和(4,7)),先合并成一个连续区间,避免重复计算间隙。
  • 遍历找出剩余区间:从总范围的起点开始,逐个对比合并后的排除区间,把排除区间之间的间隙、总起点到第一个排除区间的起点、最后一个排除区间到总终点的部分收集起来。

代码实现

def get_remaining_ranges(total_start, total_end, exclude_ranges):
    # 处理空的排除范围,直接返回总范围
    if not exclude_ranges:
        return [(total_start, total_end)]
    
    # 1. 按区间起点排序排除范围
    sorted_excludes = sorted(exclude_ranges, key=lambda x: x[0])
    
    # 2. 合并重叠或相邻的排除区间
    merged_excludes = []
    current_start, current_end = sorted_excludes[0]
    for start, end in sorted_excludes[1:]:
        if start <= current_end + 1:  # 相邻或重叠就合并
            current_end = max(current_end, end)
        else:
            merged_excludes.append((current_start, current_end))
            current_start, current_end = start, end
    merged_excludes.append((current_start, current_end))
    
    # 3. 计算剩余区间
    remaining = []
    prev_end = total_start - 1  # 初始化为总起点前一位
    
    for start, end in merged_excludes:
        # 如果当前排除区间的起点 > 上一个区间的终点+1,说明有间隙
        if start > prev_end + 1:
            remaining.append((prev_end + 1, start - 1))
        # 更新上一个区间的终点为当前排除区间的终点
        prev_end = max(prev_end, end)
    
    # 处理最后一个排除区间到总终点的部分
    if prev_end < total_end:
        remaining.append((prev_end + 1, total_end))
    
    # 过滤掉无效区间(比如start > end的情况,当排除范围覆盖总范围时会出现)
    return [r for r in remaining if r[0] <= r[1]]

测试示例

用你提到的例子测试:

total_range = (1, 20)
exclude = [(3, 8), (11, 15)]
result = get_remaining_ranges(*total_range, exclude)
print(result)  # 输出: [(1, 2), (9, 10), (16, 20)]

边界情况处理

  • 如果排除范围完全覆盖总范围:比如总范围(1,5),排除[(2,4)],返回[(1,1), (5,5)]
  • 如果排除范围在总范围外:比如总范围(1,20),排除[(21,25)],返回[(1,20)]
  • 如果有重叠的排除区间:比如总范围(1,20),排除[(3,8), (6,10)],合并后排除(3,10),返回[(1,2), (11,20)]

内容的提问来源于stack exchange,提问作者Dawgx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:18:20