Java书签 #区间合并算法与实际业务应用

1. 今日书签

力扣第56题,有个区间合并算法。类比可以实现时间区间重叠合并等业务场景。比如打卡时间、营业时间等等。
 

2. 解签方案

1)工具类:

public class IntervalMergeUtil {

    public static List<Interval> mergeStrArea(List<Interval> intervals) {
        List<Interval> result = new ArrayList<>();

        // 校验入参是否为空,如果没有需要处理的区间参数,则直接返回
        if (CollectionUtils.isEmpty(intervals)) {
            return result;
        }

        // 根据start属性进行升序排序
        Collections.sort(intervals, new Comparator<Interval>() {
            @Override
            public int compare(Interval o1, Interval o2) {
                return o1.start.compareTo(o2.start);
            }
        });

        // 这里用一个临时变量(temp)存储合并的interval
        Interval temp = intervals.get(0);
        for (int i = 1; i < intervals.size(); ++i) {
            if (intervals.get(i).start.compareTo(temp.end) <= 0) {
                if (temp.end.compareTo(intervals.get(i).end) < 0) {
                    temp.end = intervals.get(i).end;
                }
                temp = new Interval(temp.start, temp.end);
            } else {
                result.add(temp);
                temp = intervals.get(i);
            }
        }
        result.add(temp);
        return result;
    }

    @Data
    @NoArgsConstructor
    public static class Interval {
        String start;
        String end;

        Interval(String start, String end) {
            this.start = start;
            this.end = end;
        }
    }
}

2)测试验证:
测试Demo:

    public static void main(String[] args) {
        String str1 = "22:22";
        String str2 = "20:22";
        String str3 = "12:22";
        System.out.println("22:22 晚于 20:22:" + str1.compareTo(str2) > 0);
        System.out.println("12:22 晚于 20:22:" + str3.compareTo(str2) > 0);


        List<Interval> intervals = new ArrayList<>();
        Interval interval1 = new Interval("05:30", "12:00");
        Interval interval2 = new Interval("11:30", "18:00");
        Interval interval3 = new Interval("17:00", "23:00");

        intervals.add(interval1);
        intervals.add(interval2);
        intervals.add(interval3);

        List<Interval> intervalList = mergeStrArea(intervals);
        System.out.println(JSON.toJSONString(intervalList));

        List<Interval> intervals2 = new ArrayList<>();
        Interval interval4 = new Interval("04:00", "08:30");
        Interval interval5 = new Interval("08:00", "12:30");
        Interval interval6 = new Interval("13:00", "18:00");
        Interval interval7 = new Interval("18:00", "20:30");
        Interval interval8 = new Interval("20:00", "23:55");

        intervals2.add(interval4);
        intervals2.add(interval5);
        intervals2.add(interval6);
        intervals2.add(interval7);
        intervals2.add(interval8);

        List<Interval> intervalList2 = mergeStrArea(intervals2);
        System.out.println(JSON.toJSONString(intervalList2));
    }

输出结果:

22:22 晚于 20:22true
12:22 晚于 20:22false
[{"end":"23:00","start":"05:30"}]
[{"end":"12:30","start":"04:00"},{"end":"23:55","start":"13:00"}]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值