我最近遇到了一个问题。我必须找到两个整数间隔之间的设定差异。区间由两个边界决定 - 高和低。不包括高点的地方。
我想出了解决方案,考虑了几个案例。突然间,这是~12例。我在下面列出了其中一些。看起来很奇怪。有更简单的解决方案吗?
//a[ a) b[ b)
// [ )
if (a._end <= b._start)
return Lst(a);
//a[ b[ a) b)
// [ )
if (a._start < b._start && b._start < a._end &&
b._start < a._end && a._end < b._end)
return Lst(Rng(a.Start(), b.Start()));
//b[ a[ b) a)
// [ )
if (b._start < a._start && a._start < b._end &&
a._start < b._end && b._end < a._end)
return Lst(Rng(b.End(), a.End()));
//b[ b) a[ a)
// [ )
if (b._end <= a._start)
return Lst(a);
//a[ b[ b) a)
// [ ) [ )
if (a._start < b._start && b._start < a._end &&
a._start < b._end && b._end < a._end)
return Lst(
Rng(a.Start(), b.Start()),
Rng(b.End(), a.End()));
答案 0 :(得分:3)
(我不明白为什么你决定生成... b._start < a._end && b._start < a._end ...
)
除此之外,您尝试在单个return语句中构建整个结果会使代码变得更加复杂。如果您可以在局部变量中逐步构建结果,然后只返回该局部变量,则代码将大大简化。
依靠min
和max
等标准函数而不是将min/max
逻辑嵌入到代码中也会使其更加紧凑。
假设我们在本地列表变量result
中构建结果,并通过执行result.append()
向其添加间隔。
差异操作最多可以产生两个区间:b
左侧一个,b
右侧另一个区间。我们按顺序计算它们
List result;
if (a._start < b._start)
// Left portion exists
result.append(Rng(a._start, min(a._end, b_start)));
if (a._end > b._end)
// Right portion exists
result.append(Rng(max(a._start, b._start), a._end));
return result;
我认为间隔已经标准化,即a._start <= a._end
,但似乎你的代码也依赖于这个假设。