查找两个整数间隔之间的集合差异

时间:2014-10-13 11:06:31

标签: algorithm

我最近遇到了一个问题。我必须找到两个整数间隔之间的设定差异。区间由两个边界决定 - 高和低。不包括高点的地方。

我想出了解决方案,考虑了几个案例。突然间,这是~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()));

1 个答案:

答案 0 :(得分:3)

(我不明白为什么你决定生成... b._start < a._end && b._start < a._end ...

等冗余条件

除此之外,您尝试在单个return语句中构建整个结果会使代码变得更加复杂。如果您可以在局部变量中逐步构建结果,然后只返回该局部变量,则代码将大大简化。

依靠minmax等标准函数而不是将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,但似乎你的代码也依赖于这个假设。