Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对位于另一个单独范围内的范围求和的算法_Javascript_Algorithm_Sum_Range - Fatal编程技术网

Javascript 对位于另一个单独范围内的范围求和的算法

Javascript 对位于另一个单独范围内的范围求和的算法,javascript,algorithm,sum,range,Javascript,Algorithm,Sum,Range,我有两组范围,一组是任意长度的单一范围(a),另一组是范围(B),其中一些或部分可能位于或不位于单一范围(a)内 我需要计算(B)中全部或部分范围的总和,它们位于单个范围(A)内 我正在使用Javascript 示例: A = [20,40]<br> B = [14,22],[24,27],[31,35],[38,56]<br> Result = 2+3+4+2 = 11<br> A = [120,356]<br> B = [234,567]&l

我有两组范围,一组是任意长度的单一范围(a),另一组是范围(B),其中一些或部分可能位于或不位于单一范围(a)内

我需要计算(B)中全部或部分范围的总和,它们位于单个范围(A)内

我正在使用Javascript

示例:

A = [20,40]<br>
B = [14,22],[24,27],[31,35],[38,56]<br>
Result = 2+3+4+2 = 11<br>

A = [120,356]<br>
B = [234,567]<br>
Result = 122<br>
A=[20,40]
B=[14,22]、[24,27]、[31,35]、[38,56]
结果=2+3+4+2=11
A=[120356]
B=[234567]
结果=122
我需要一个返回结果和的算法/函数

我使用了一个优秀的范围合并算法在这里张贴之前,我希望一个类似的优雅的解决方案,这个问题

(如果存在误解,则任命。
我一直在研究一个函数,但我在编码环境中的数学不是很好,所以我的解决方案是使用非数学代码(在这里发布会很尴尬!)。我希望在这里得到一些帮助,以创建一个紧凑的基于数学的解决方案)

您可以获取子范围的增量,并根据给定范围调整起始值和结束值

函数getDelta([start,end],值){ 返回值 .filter(([l,r])=>r>=start&l s+Math.min(r,end)-Math.max(l,start),0; } log(getDelta([20,40],[10,11],[14,22],[24,27],[31,35],[38,56],[400500]);
log(getDelta([120356]、[10,11]、[234567]、[400500])这是我使用的ES5兼容版本,供感兴趣的人使用:

function getDelta(range, values) {
    return values.reduce(function(s,pair){
        return s + Math.max(0, Math.min(pair[1], range[1]) - Math.max(pair[0], range[0]));
    },0);
}

然而,我只会使用它,如果你需要IE向后兼容。我在一个跟踪当前趋势的环境中工作

我们能看看你尝试了什么吗?为什么你会得到结果?背后的算法是什么?你实际上不想要范围的和,你想要的是初始范围内的数字计数的和。这比看起来容易得多,因为您只需要展开范围并计算第一个范围内的总数。但我同意@Keith的观点,你应该先发布你尝试过的东西。我在纸上计算出的示例仅显示了给定输入的预期结果。在第一个例子中,A=[20,40]B=[24,27]4个数字
24,25,26,27
属于该组。根据你的说法,这个范围内只有3个数字。那么,列表是左排他还是右排他?差异可能是负数?答案假设左值小于/等于右值。这里的问题是,如果没有一个数字在该范围内,则计数错误。例如,在第一个范围为
[10,11]
时尝试。顺便说一句,认为那些不费吹灰之力而只要求代码的问题不应该得到真正的答案。@ChatterOne,这不是规范,因为:“计算(B)中的所有或部分范围的总和,它们位于单个范围(A)内。”因此,你认为如果第一个范围是
[10,11]
。获取
-63
是正确的输出吗?