我最近在接受采访时被问到这个问题。
问题陈述:您将获得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。因此,如果方程式无法解决,那就太糟糕了。
任何人都可以为此提供另一种解决方案吗?
答案 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
}
最后要注意的是,如果两个约会每月/每年重复发生,那么月份的日期需要匹配 - 否则它们不会在同一天发生。
至少我是这样看的。希望这有助于:)