java 查找所在区间_java – 算法 – 在循环世界中查找重叠区间的持续时间(24小时)...

令人惊讶的是很多答案在短时间内……

我遵循了在其他答案中已经提出的相同想法:当开始时间s小于结束时间e时,结果可以分解为两个单独的计算,对于范围[s,24]和[0,e ].

这可以“相互”完成,因此只需要考虑3个简单的情况,其余的可以通过递归调用来完成.

但是,我试过

>考虑(根据图像),终点应该是包容性的事实(!)

>再添加一些测试用例

>很好地可视化配置:-)

这是MCVE的结果:

public class OverlappingIntervals

{

private static final long INTERVAL_SIZE = 24;

public static void main(String[] args)

{

test(6,23, 2,17);

test(0,12, 12,2);

test(11,4, 12,3);

test(12,4, 11,3);

}

private static void test(

long s0, long e0, long s1, long e1)

{

System.out.println(createString(s0, e0, s1, e1));

System.out.println(findOverlappingInterval(s0, e0, s1, e1));

}

private static String createString(

long s0, long e0, long s1, long e1)

{

StringBuilder sb = new StringBuilder();

sb.append(createString(s0, e0, "A")).append("\n");

sb.append(createString(s1, e1, "B"));

return sb.toString();

}

private static String createString(long s, long e, String c)

{

StringBuilder sb = new StringBuilder();

for (int i=0; i

{

if (s < e)

{

if (i >= s && i <= e)

{

sb.append(c);

}

else

{

sb.append(".");

}

}

else

{

if (i <= e || i >= s)

{

sb.append(c);

}

else

{

sb.append(".");

}

}

}

return sb.toString();

}

public static long findOverlappingInterval(

long s0, long e0, long s1, long e1)

{

return compute(s0, e0+1, s1, e1+1);

}

public static long compute(

long s0, long e0, long s1, long e1)

{

if (s0 > e0)

{

return

compute(s0, INTERVAL_SIZE, s1, e1) +

compute(0, e0, s1, e1);

}

if (s1 > e1)

{

return

compute(s0, e0, s1, INTERVAL_SIZE) +

compute(s0, e0, 0, e1);

}

return Math.max(0, Math.min(e0, e1) - Math.max(s0, s1));

}

}

前两个测试用例是问题中给出的测试用例,它们分别正确打印12和4.其余两个用于测试其他重叠配置:

......AAAAAAAAAAAAAAAAAA

..BBBBBBBBBBBBBBBB......

12

AAAAAAAAAAAAA...........

BBB.........BBBBBBBBBBBB

4

AAAAA......AAAAAAAAAAAAA

BBBB........BBBBBBBBBBBB

16

AAAAA.......AAAAAAAAAAAA

BBBB.......BBBBBBBBBBBBB

16

但是,请注意,可能必须创建进一步的测试配置以涵盖所有可能的情况.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值