给定一个日期范围列表,如何验证日期范围中的所有日期都包含在列表中
本文关键字:日期 范围 列表 包含 验证 一个 何验证 | 更新日期: 2023-09-27 17:50:53
我有一个日期范围列表。
05/01/2012 - 07/01/2012
07/02/2012 - 09/05/2012
01/01/2012 - 03/31/2012
08/01/2012 - 12/31/2012
现在的问题是验证给定列表是否涵盖了特定范围内的所有日期。例如,此列表涵盖2012年1月5日至2012年12月31日范围内的所有日期,但不包括2012年1月1日至2012年12月31日,因为4月份的日期不包括在此列表中。假设如下:
- 日期范围有效-开始日期<=结束日期。
- 日期范围可能重叠,如上述第2和第4的情况。
- 列表未按任何方式排序。
到目前为止,我所做的是测试异常值,如
查找最小的开始日期和最大的结束日期—如果测试日期范围的开始日期和/或结束日期分别小于/大于这些日期,则测试失败。
但是检查中间错过的日期的最佳策略是什么呢?提前感谢!
最简单的策略是解析所有涉及的日期。O(N)
按起始日期对日期进行排序。O(N log N)
时间
比较结束日期与下一个开始日期(忽略任何向后的结束日期)O(N)
如果一个结束日期到下一个开始日期超过一天,则存在空白
首先要做的是修复输入数据。
- 按开始日期订购所有范围
- 通过设置开始日期来删除所有重叠
- 消除任何因2 而消失的范围
那么范围就变成
01/01/2012 - 03/31/2012
05/01/2012 - 07/01/2012
07/02/2012 - 09/05/2012
09/06/2012 - 12/31/2012
那么你只需要找到缺失的日期,看看你是否能想出如何做到这一点。
将日期转换为自1970年1月1日(或其他参考日期)以来的天数。
那么你的问题就变成了找到缺失的整数
生成范围中的每个日期,将它们放在一个列表中,并测试您的候选人是否在该列表中。
尝试如下操作(按最小日期对列表范围进行排序后):-
i=0
a=min_date at 0 position
b=max_date corresponding to a
while list has elements
c= min_date at (i+1) position
d=max_date corresponding to c
if (b< (c - 1 day))
then there is a gap;
else
{
if(b<d) // done to handle the situation :- 06/07/2012 - 12/31/2012
// 08/07/2012 - 11/31/2012. Then b will still remain 12/31/2012 after if condition
{
b=d;
}
}
i=i+2;
end while;
以上将只查找列表中缺少的日期