检查重叠2定期约会?

时间:2018-04-17 03:45:41

标签: java algorithm calendar overlap

我最近在接受采访时被问到这个问题。

问题陈述:您将获得2次定期约会。每个约会包含所需的开始时间,可选的结束时间和重复规则(必需)。 所有重复规则如下所列:

  • 每日:例如:每2天
  • 每周:例如:周二每3周
  • 每月:例如:第17天每2个月/第3个星期二每月
  • 每年:例如:4月17日每2年

你必须检查以上事件的重叠2。

我有一个每日复发的解决方案。

首次预约:开始时间:1/3/201(日/月/日),结束时间:,重复规则:每2天

第二次预约:开始时间:2008年3月3日(日/月/日),结束时间:,重复规则:每3天

第一次约会的下一天:1 + 2 * x

第二次约会的第二天:3 + 3 * y

如果两个重叠约会:1 + 2 * x = 3 + 3 * y< => 2 * x - 3 * y = 2;

int x = 0;
int y = 0;

for(x=1; ; x++){
   for(y=1; ; y++){
       if(2*x - 3*y == 2){
          break;
       }
   }
}

(x,y) = (4,2). 

两项约会在9/1/2018重叠

如果两个约会没有结束时间,我找到(x,y)的循环将不具有表达式-2。因此,如果方程式无法解决,那就太糟糕了。

任何人都可以为此提供另一种解决方案吗?

1 个答案:

答案 0 :(得分:1)

我刚接触堆栈溢出,所以希望这是有道理的:

周基本上归结为7天的团​​体 几年基本上归结为12个月的团体

我们不能说一个月或一年是一个天数,因为月份长度不一(2月28/29对3月31日),也有闰年需要注意。

这意味着如果第一次约会以天/周重复出现,而第二次约会以数月/年为单位,则必须在某些时候重叠。我没有这方面的正式证据,但我在一些数学教科书中假设有关于此的理论页面。现在可以使用类似于上面编码的算法找到约会匹配的日期。实际上,由于闰年,数月等原因,使用图书馆作为日期可能是明智之举,但在采访中我不认为他们希望你这样做。

如果两个约会来自同一个“家庭”(两者都可以用天来衡量,或者两者都可以用几个月来衡量),那么它们不会在同一天发生的唯一情况就是复发第一次约会(n)是第二次约会(m)重复的倍数,反之亦然。

if(n<=m && n%m==0 || m<=n && m%n==0) {
    //they won't happen on the same day/month
}

最后要注意的是,如果两个约会每月/每年重复发生,那么月份的日期需要匹配 - 否则它们不会在同一天发生。

至少我是这样看的。希望这有助于:)