8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

有什么合适的算法可以找到两个时间段(例如上午 9 点至下午 5 点)之间的 30 分钟空闲时间?

LetsScrapeData 1月前

20 0

我遇到了这个问题陈述,其中两个时段(上午 9 点至下午 5 点)之间按排序顺序给出了 N 个时间段。{ \'start\':\'09:15\', \'duration\': 30 }, {&...

我遇到了这个问题陈述

  1. 两个时段(上午 9 点至下午 5 点)之间按排序顺序给出了 N 个时间段。
    { "start": "09:15", "duration": 30 },
    { "start": "10:00", "duration": 60 },
    { "start": "11:15", "duration": 30 },
    { "start": "12:45", "duration": 30 },
    { "start": "13:15", "duration": 90 },
    { "start": "15:00", "duration": 30 },
    { "start": "15:30", "duration": 30 }
  1. p2

  2. p3

我相信最简单的算法(即传递输入并计算空闲槽)应该可以解决这个问题(下面的代码)。这应该具有 O(N) 时间复杂度和 O(1) 空间复杂度。

我问这个问题,是否有更好的算法来解决这类问题。

public static int findMaxSlots(JSONArray appointments) {
    int result=0;
    int prevTimeInMins = 540; //initialize with 9am minutes
    String beginTime = "9:00";
    String endOfDayTime = "17:00";
    String startTime;
    Long duration;
    int len = appointments.size();

    //this takes care of gap from 9am to first input(if any)
    Integer beginMinutes = getMinutes(beginTime);
    JSONObject appt = (JSONObject) appointments.get(0);
    startTime = (String)appt.get("start");
    if(getMinutes(startTime)-beginMinutes>0) {
      result+=((getMinutes(startTime)-beginMinutes)/30);
      System.out.println("result begin" + result);
    }

    //calculate for regular appointments
    for (int i = 0; i < appointments.size(); i++) {
        appt = (JSONObject) appointments.get(i);
        startTime = (String)appt.get("start");
        duration = (Long)appt.get("duration");

        Integer mins = getMinutes(startTime);//555mins

        System.out.println("mins loop" + mins);
        if(mins-prevTimeInMins>30) {
          result+=((mins-prevTimeInMins)/30);
          prevTimeInMins=mins+ duration.intValue();
        }
        System.out.println("result loop" + result);
      }

    //this takes care of gap from last input to 5pm(if any)
    Integer endMinutes = getMinutes(endOfDayTime);
    appt = (JSONObject) appointments.get(len-1);
    startTime = (String)appt.get("start");
    duration = (Long)appt.get("duration");
    Integer lastApptMins = getMinutes(startTime) + duration.intValue();
    if(endMinutes-lastApptMins>0) {
      result+=((endMinutes-lastApptMins)/30);
      System.out.println("result end" + result);
    }

    return result;
  }

  private static int getMinutes(String startTime) {
    String[] times = startTime.split(":");
    int minutes = Integer.MIN_VALUE;

    //15:00 -> 900minutes, 15:30 -> 930minutes
    minutes = Integer.parseInt(times[0])*60;
    minutes += Integer.parseInt(times[1]);

    return minutes;
  }

谢谢。

帖子版权声明 1、本帖标题:有什么合适的算法可以找到两个时间段(例如上午 9 点至下午 5 点)之间的 30 分钟空闲时间?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由LetsScrapeData在本站《algorithm》版块原创发布, 转载请注明出处!
最新回复 (0)
  • \' 是否有更好的算法\' 取决于你所说的更好是什么意思。更快?更少的内存?更少的代码?现在,唯一的答案就是表达意见。

  • “我相信最简单的算法……应该可以解决这个问题”为什么这是信念问题?测试代码,看看它是否有效。不应该涉及信念。

返回
作者最近主题: