我有一个逻辑问题一直无法理解。我正在处理用户可以更改、添加或删除的折扣范围集合,需要验证它们是否存在重叠值。
例如,我有一个包含最小和最大整数值的数组 [{min: 0, max: 33},{min: 33, max: 66},{min: 66, max: 100}]。
我需要确定任何给定范围是否相互重叠,但这些范围允许仅重叠1次。范围数量也是可变的,因此每个数组可能有任意数量的集合。
例如: [{min: 0, max: 33},{min: 33, max: 66},{min: 66, max: 100}] 或 [{min: 5, max: 50},{min: 51, max: 66},{min: 66, max: 100}] 应该返回true,因为存在重叠范围,但仅重叠了 1。
[{min: 0, max:34},{min: 33, max: 66},{min: 66, max: 100}] 或 [{min: 0, max: 33},{min: 32, max: 66},{min: 66, max: 100}] 应该返回false,因为范围重叠超过1。
以下代码可以找到重叠,但不允许重叠1。
例如,我有一个包含最小和最大整数值的数组 [{min: 0, max: 33},{min: 33, max: 66},{min: 66, max: 100}]。
我需要确定任何给定范围是否相互重叠,但这些范围允许仅重叠1次。范围数量也是可变的,因此每个数组可能有任意数量的集合。
例如: [{min: 0, max: 33},{min: 33, max: 66},{min: 66, max: 100}] 或 [{min: 5, max: 50},{min: 51, max: 66},{min: 66, max: 100}] 应该返回true,因为存在重叠范围,但仅重叠了 1。
[{min: 0, max:34},{min: 33, max: 66},{min: 66, max: 100}] 或 [{min: 0, max: 33},{min: 32, max: 66},{min: 66, max: 100}] 应该返回false,因为范围重叠超过1。
以下代码可以找到重叠,但不允许重叠1。
var overlappedRanges = [{
min: 0,
max: 33
}, {
min: 33,
max: 66
}, {
min: 66,
max: 100
}];
var nonOverlappedRanges = [{
min: 0,
max: 32
}, {
min: 33,
max: 66
}, {
min: 67,
max: 100
}];
var checkForOverlap = function(arr) {
var err = false;
arr.forEach(function(e, i) {
arr.forEach(function(ee, ii) {
if (ee !== e) {
if (e.min >= ee.min && e.min <= ee.max) {
err = true;
}
if (e.max >= ee.min && e.max <= ee.max) {
err = true;
}
}
});
});
if (err) {
return 'Overlap Found in ' + JSON.stringify(arr);
} else {
return 'NO Overlap Found in ' + JSON.stringify(arr);
}
}
$('#overlapped').text(checkForOverlap(overlappedRanges));
$('#notOverlapped').text(checkForOverlap(nonOverlappedRanges))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span id="overlapped" style="color: red;"></span>
<br>
<span id="notOverlapped" style="color: green;"></span>
(a,b) => a.max > b.min && b.max > a.min
来确定两个元素是否重叠。 - Thomas