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

交错数组范围查询时如何去重统计符合条件的元素个数

问题分析

你现有代码的统计逻辑存在重复计数问题:程序会遍历待搜索数组的每个元素,针对每个元素依次检查所有查询范围,每匹配一个范围就对总计数累加1。当多个范围重叠覆盖同一个元素时,该元素会被统计多次,所以包含第三个覆盖所有元素的范围时,最终结果为9而非你期望的5。

修正方案

调整内层循环逻辑:单个元素只要匹配到任意一个有效范围,就仅计数1次,直接终止当前元素的后续范围校验,进入下一个元素的判断流程。

修改后的完整代码
public static int GetDecimalsCount(decimal[] arrayToSearch, decimal[][] ranges)
{
    if (arrayToSearch is null)
    {
        throw new ArgumentNullException(nameof(arrayToSearch));
    }
    if (ranges is null)
    {
        throw new ArgumentNullException(nameof(ranges));
    }
    for (int x = 0; x < ranges.Length; x++)
    {
        if (ranges[x] is null)
        {
            throw new ArgumentNullException(nameof(ranges));
        }
        if ((ranges[x].Length > 0 && ranges[x].Length < 2) || ranges[x].Length > 2)
        {
            throw new ArgumentException("范围数组的元素必须为空或者包含两个边界值");
        }
    }

    int sum = 0;
    for (int i = 0; i < arrayToSearch.Length; i++)
    {
        for (int j = 0; j < ranges.Length; j++)
        {
            if (ranges[j].Length == 0)
            {
                continue;
            }
            if (arrayToSearch[i] >= ranges[j][0] && arrayToSearch[i] <= ranges[j][1])
            {
                sum++;
                // 匹配到第一个符合的范围后直接跳出内层循环,避免重复计数
                break;
            }
        }
    }

    return sum;
}
可选简化写法(基于LINQ)

如果你偏好更简洁的语法,可以保留参数校验部分后,用LINQ实现核心统计逻辑:

return arrayToSearch.Count(num => 
    ranges.Any(r => r.Length != 0 && num >= r[0] && num <= r[1])
);

该写法的逻辑和修改后的循环逻辑完全一致,可读性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:15:03