【问题标题】:Check overlap 2 recurring appointments?检查重叠 2 定期约会?
【发布时间】:2018-09-26 22:00:35
【问题描述】:

我最近在一次采访中被问到这个问题。

问题陈述:您有 2 次定期约会。每个约会都包含一个必需的开始时间、一个可选的结束时间和一个重复规则(必需)。 下面列出了所有重复规则:

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

您必须检查上述事件的重叠 2。

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

第一次约会:开始时间:1/3/2018(dd/MM/YYYY),结束时间:,重复规则:每 2 天

第二次约会:开始时间:3/3/2018(dd/MM/YYYY),结束时间:,重复规则:每 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). 

两个约会在 2018 年 9 月 1 日重叠

如果两个约会没有结束时间,我的查找 (x,y) 循环将没有表达式 2。所以,如果方程无法解,那就很糟糕了。

谁能为此提供其他解决方案?

【问题讨论】:

  • 您可能想了解线性丢番图方程 - 以获得一般解或发现解不存在
  • 这很复杂,但可能并非不可能。没有人能在面试中给出完整的解决方案。我的猜测是他们希望你对挑战以及如何应对挑战发表一些看法。就像一个在星期一,另一个在星期四,你已经可以看出没有重叠。
  • 是一日一整天的活动吗?所以结束时间是指重复结束的时间,而不是个人约会结束的时间??
  • tks @MBo。我读过关于线性丢番图方程的文章。它对我有好处。
  • tks @Ole V.V.这对我来说非常非常复杂。问题太多

标签: java algorithm calendar overlap


【解决方案1】:

我刚开始回答堆栈溢出问题,所以希望这是有道理的:

每周基本上可以归结为 7 天一组 年基本上归结为 12 个月的组

我们不能说一个月或一年就是天数,因为月份的长度各不相同(2 月 28 日和 3 月 31 日),而且还有闰年需要注意。

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

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

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

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

至少我是这么看的。希望这会有所帮助:)

【讨论】:

  • 可能会遗漏一两个极端案例,但想法很好。就像如果一个重复周期是另一个重复周期的倍数,但它们具有相同的开始日期 - 那么肯定存在重叠。
  • tks @David M 为您提供解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多