背景:
对 非连续的多个有序的时间区间进行 分割,结果是拆分出更小的时间区间,基本规则就是 对于时间区间 A来说,如果有 时间区间B 与A有交集,则 用B对A进行分割,举例如下:
1-9:表示 1号到9号
时间区间A: 1-9、10-29、30-31
例子1:
时间区间B: 1-8、9-19、20-31
那么用B对A进行分割,结果应该是:
1-8、9-9、10-19、20-29、30-31
例子2:
时间区间B: 4-8、9-19、20-28
那么用B对A进行分割,结果应该是:
1-3、4-8、9-9、10-19、20-28、29-29、30-31
1-9、10-29、30-31
例子3:
时间区间B: 8-8、9-19、20-31
那么用B对A进行分割,结果应该是:
1-7、8-8、9-9、10-19、20-29、30-31
求助该如何进行切割?
方便其他看,加一段说明
[1,9],[10,19],[20,31]
这个时间段,我们理解为一个月休3次。分别是[9,10],[19,20],[31,1]
,也就是0.5,9.5和19.5也就是说有个隐藏的
[32,0]
而这三个点,我们实际上可以用0,9,19来表示,需要右端的时候,再+1即可。
我们用二进制按位取的思路来记录这个时间点就是 1 000 000 000 100 000 001
从右向左看第0,9,19位分别是 1,表示休息日。函数
getLeft
就做了如上处理,把带端点的数组转化为二进制数。试了一下,早上的回答有问题,join不能这么用,重新写一个
实际上我们只需要定位分割点就可以了
那观察问题,不难看出是要对月内的日期分割,那么自然是个整数日期,而且一个月最多只有31天,与整数最大31位不谋而合。于是嘛。。。
测试一下
旧答案
如果是整数分隔的话,我有个想法,可以试一试
试试