我的日程安排表(理解代码)学习记录Java

一.直接遍历比较简单,主要是找到时间段是不是可以预定的时间,即对于集合中已有的元素(有没有元素都一样)进行遍历比较,任意拿到一个集合元素时[left, right) 与 [start, end)需要一个预定条件 ==> left >= end || start >= right 那么可知条件非为 ==> left < end && start < right, 此时产生交集,不可加入其中,返回false。

class MyCalendar {
    List<int[]> booked;

    public MyCalendar() {
        booked = new ArrayList<int[]>(); 
    }
    
    public boolean book(int start, int end) {
        for(int[] arr : booked){
            int left = arr[0], right = arr[1];
            if (left < end && start < right){
                return false;
            }
        }
        booked.add(new int[]{start, end});
        return true;
    }
}

/**
 * Your MyCalendar object will be instantiated and called as such:
 * MyCalendar obj = new MyCalendar();
 * boolean param_1 = obj.book(start,end);
 */

二.二分查找,首先通过重写比较器,指定大小规则,即按照集合元素数组第一个元素大小进行比较升序。此时寻找大于或者等于end的元素[left1, right1)和前一个集合[left2, right2),那么条件为right2 <= start < end <= left1,可以预定 ==> 当找到比end大或者等于的元素时,看前一个元素的right2是否比start小,满足就可以预定,其他情况同理,代码中举了两个例子,希望可以帮助您的理解。

class MyCalendar {
    TreeSet<int[]> booked;

    public MyCalendar() {
        // 比较器重写 按集合数组第一个元素大小进行升序
        booked = new TreeSet<int[]>((o1, o2) -> o1[0] - o2[0]); 
    }
    
    public boolean book(int start, int end) {
        // 集合为空,直接预订
       if (booked.isEmpty()){
           booked.add(new int[]{start, end});
           return true;
       }
       // 假设集合中已有[[10, 20]] ,现存储[15, 27];
       // 假设集合中已有[[10, 20]], 现存储[5, 10];
       // 大于等于end的第一个区间为[l1,r1),前一个区间[l2,r2);预定条件:r2 <= start < end <= l1
       // 临时数组,存储当前end时间
       // temp = [15, 0]
       // temp = [5, 0]
       int[] temp = {end, 0};
       // ceiling(E e)返回此集中大于或等于(以重写的比较器比较)给定元素的最小元素,或者如果没有此类元素。null
       // 获取l1
       // arr = null (15 > 10 没有比给定元素大于等于的元素)
       // arr = [10, 20] (5 < 10 存在比给定元素大于等于的元素)
       int[] arr = booked.ceiling(temp);
       // last()返回此集中当前的最后一个(最高)元素。
       // lower(E e)返回此集中严格小于给定元素的最大元素,或者如果没有此类元素。null
       // 获取r2 ,prev存在两种情况:集合中元素没有比end大 ==> 获取当前最大元素数组;存在比end大的元素 ==> 获取前一个元素数组
       // arr 为空, prev = [10, 20];
       // arr不为空, prev = null
       // int[] prev = arr == null ? booked.last() : booked.lower(arr);
       // first()返回此集中当前第一个(最低)元素。
       // arr 与 [10, 20]不匹配 false || [10, 20]中20 > 15 false ==> false
       // arr 与 [10, 20]匹配 true ==> true加入集合
       if (arr == booked.first() || booked.lower(temp)[1] <= start){
           booked.add(new int[]{start, end});
           return true;
       }
       return false;
    }
}

/**
 * Your MyCalendar object will be instantiated and called as such:
 * MyCalendar obj = new MyCalendar();
 * boolean param_1 = obj.book(start,end);
 */

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
jQuery是一种流行的JavaScript库,许多开发人员使用它来简化代码和提高可维护性。下面是一个使用jQuery和CSS创建日程安排的示例代码: HTML代码: ``` <div class="calendar"> <div class="header"> <div class="month">五月</div> <div class="year">2021年</div> </div> <table class="days"> <tr> <th>周日</th> <th>周一</th> <th>周二</th> <th>周三</th> <th>周四</th> <th>周五</th> <th>周六</th> </tr> <tr> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td>1</td> </tr> <!-- 省略其他日期行的代码 --> </table> </div> ``` CSS代码: ``` .calendar { font-family: Arial, sans-serif; font-size: 14px; width: 400px; margin: 0 auto; border: 1px solid #ccc; border-radius: 5px; padding: 10px; } .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .month { font-size: 20px; font-weight: bold; } .days { border-collapse: collapse; width: 100%; } th { text-align: center; padding: 7px; } td { text-align: center; border: 1px solid #ccc; padding: 7px; } td:hover { background-color: #eee; } ``` JavaScript代码: ``` $(document).ready(function(){ var today = new Date(); var currentMonth = today.getMonth(); var currentYear = today.getFullYear(); var months = ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]; function generateCalendar(month, year) { $(".days td").empty().removeClass("today"); $(".month").text(months[month]); $(".year").text(year); var firstDay = new Date(year, month, 1); var startingDay = firstDay.getDay(); var monthLength = 32 - new Date(year, month, 32).getDate(); for (i = 1; i <= monthLength; i++) { if (i === today.getDate() && year === today.getFullYear() && month === today.getMonth()) { $(".days td").eq(startingDay + i - 2).addClass("today"); } $(".days td").eq(startingDay + i - 1).text(i); } } generateCalendar(currentMonth, currentYear); $(".prev").click(function(){ currentYear = (currentMonth === 0) ? currentYear - 1 : currentYear; currentMonth = (currentMonth === 0) ? 11 : currentMonth - 1; generateCalendar(currentMonth, currentYear); }); $(".next").click(function(){ currentYear = (currentMonth === 11) ? currentYear + 1 : currentYear; currentMonth = (currentMonth + 1) % 12; generateCalendar(currentMonth, currentYear); }); }); ``` 这个示例创建一个基本的日历并允许用户向前或向后浏览月份。它还突出显示今天日期的单元格。您可以根据需要调整CSS和JavaScript来适应您的日程安排需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未满3岁

我爱你,你爱我,蜜雪冰城甜蜜蜜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值