我需要计算(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>
我需要一个可以返回结果总和的算法/函数。
我使用了以前在此处发布的一种出色的范围合并算法,希望能对此问题提供类似的优雅解决方案。
(如果有误会,请致以歉意。 我一直在研究函数,但是我在编码环境中的数学不好,所以我的解决方案是使用非数学代码(将其张贴在这里真是令人尴尬!)。我希望能在这里得到一些帮助,以创建一个基于数学的紧凑型解决方案)
答案 0 :(得分:1)
这是我使用的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向后兼容的情况下,我才使用它。我的工作环境与时俱进!
答案 1 :(得分:-1)
您可以获取子范围的差值,并在给定范围内调整开始和结束值。
function getDelta([start, end], values) {
return values
.filter(([l, r]) => r >= start && l <= end)
.reduce((s, [l, r]) => s + Math.min(r, end) - Math.max(l, start), 0);
}
console.log(getDelta([20, 40], [[10, 11], [14, 22], [24, 27], [31, 35], [38, 56], [400, 500]]));
console.log(getDelta([120, 356], [[10, 11], [234, 567], [400, 500]]));
根据 ChatterOne 在评论中的建议,您可以将Math.max
与零一起使用以防止出现负值。
function getDelta([start, end], values) {
return values
.reduce((s, [l, r]) => s + Math.max(0, Math.min(r, end) - Math.max(l, start)), 0);
}
console.log(getDelta([20, 40], [[10, 11], [14, 22], [24, 27], [31, 35], [38, 56], [400, 500]]));
console.log(getDelta([120, 356], [[10, 11], [234, 567], [400, 500]]));