diff --git a/README.md b/README.md index f93b6ba..c450077 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # JavaLocalBase Simple local base for java problems + +https://leetcode.com/explore/challenge/card/july-leetcoding-challenge-2021/608/week-1-july-1st-july-7th/3803/ \ No newline at end of file diff --git a/src/main/java/Main.java b/src/main/java/Main.java index d08a4f0..f3ebd2c 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,46 +1,158 @@ -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; +import java.util.*; public class Main { - public static void main(String[] args) throws IOException { + public static void main(String[] args) { CodeWorker code = new CodeWorker(); - code.fileInputReadStream(); - System.out.println(code.testMethod()); } } class CodeWorker { - public void fileInputReadStream() throws IOException { - FileInputStream in = null; - FileOutputStream out = null; - try { - in = new FileInputStream("src/input.txt"); - out = new FileOutputStream("output.txt"); + private Integer startTime; + private Integer endTime; + private Integer meetingMinutes; - int c; - while ((c = in.read()) != -1) { - out.write(c); + public String testMethod() { + return "method"; + } + + public List getPossibleScheduleTimes(List> schedules, List bounds, String meetingLength) { + var complementaryTimeBlocks = new ArrayList(); + + var schedule1 = schedules.get(0); + var schedule2 = schedules.get(1); + + var schedule1Free = new ArrayList(); + var schedule2Free = new ArrayList(); + + var originalStartTime = this.translateToMinutes(bounds.get(0)); + this.startTime = this.translateToMinutes(bounds.get(0)); + this.endTime = this.translateToMinutes(bounds.get(1)); + this.meetingMinutes = this.translateToMinutes(meetingLength); + + if (schedule1.size() > schedule2.size()) { + // traverse the smaller schedule first + var temp = schedule2; + schedule2 = schedule1; + schedule1 = temp; + } + + for (var i = 0; i < schedule1.size(); i++) { + var time = schedule1.get(i); + var timeRange = this.parseTimeRange(time); + var lastTimeBlockerToThisMeeting = (timeRange.startTime - startTime); + var hasFreeSpace = lastTimeBlockerToThisMeeting >= meetingMinutes; + + if (hasFreeSpace) { + schedule1Free.add(new TimeRange(startTime, timeRange.startTime)); } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (in != null) { - in.close(); + startTime = timeRange.endTime; + + if (i == schedule1.size()-1) { + if((endTime - timeRange.endTime) >= meetingMinutes ) { + schedule1Free.add(new TimeRange(timeRange.endTime, endTime)); + } } - if (out != null) { - out.close(); + } + + startTime = originalStartTime; + + for (var i = 0; i < schedule2.size(); i++) { + var time = schedule2.get(i); + var timeRange = this.parseTimeRange(time); + var lastTimeBlockerToThisMeeting = (timeRange.startTime - startTime); + var hasFreeSpace = lastTimeBlockerToThisMeeting >= meetingMinutes; + + if (hasFreeSpace) { + schedule2Free.add(new TimeRange(startTime, timeRange.startTime)); + } + startTime = timeRange.endTime; + + if (i == schedule2.size()-1) { + if((endTime - timeRange.endTime) >= meetingMinutes ) { + schedule2Free.add(new TimeRange(timeRange.endTime, endTime)); + } } } + + var schedule2Pointer= 0; + for (var free1: schedule1Free) { + for (var i=schedule2Pointer; i < schedule2Free.size(); i++) { + var free2 = schedule2Free.get(i); + var isFree2WraparoundFree1 = free1.startTime >= free2.startTime && free1.endTime <= free2.endTime; + var isFree2InnerBlockOfFree1 = free1.startTime <= free2.startTime && free1.endTime >= free2.endTime; + var isFree2AtStartOfFree1 = free1.startTime >= free2.startTime && free2.endTime <= free1.endTime; + var isFree2AtTheEndOfFree1 = free1.startTime <= free2.startTime && free2.endTime >= free1.endTime; + + if (isFree2WraparoundFree1) { + complementaryTimeBlocks.add(free1.toTimeString()); + schedule2Pointer = i; + } else if (isFree2InnerBlockOfFree1) { + if ((free2.endTime - free2.startTime) >=meetingMinutes) { + complementaryTimeBlocks.add(free2.toTimeString()); + } else { + schedule2Pointer = i; + } + } else if (isFree2AtStartOfFree1) { + if ((free2.endTime - free1.startTime) >= meetingMinutes) { + complementaryTimeBlocks.add(new TimeRange(free1.startTime, free2.endTime).toTimeString()); + } else { + schedule2Pointer = i; + } + } else if (isFree2AtTheEndOfFree1) { + if ((free1.endTime - free2.startTime) >= meetingMinutes) { + complementaryTimeBlocks.add(new TimeRange(free2.startTime, free1.endTime).toTimeString()); + } else { + schedule2Pointer = i; + break; + } + } else { + schedule2Pointer = i; + break; + } + } + } + + return complementaryTimeBlocks; } - public String testMethod() { - return "method"; + private TimeRange parseTimeRange(String time) { + var rangeSplit = time.split("-"); + var startTime = this.translateToMinutes(rangeSplit[0]); + var endTime = this.translateToMinutes(rangeSplit[1]); + return new TimeRange(startTime, endTime); + } + + private Integer translateToMinutes(String time) { + var hoursAndMinutes = time.split(":"); + var hours = Integer.parseInt(hoursAndMinutes[0]); + var minutes = Integer.parseInt(hoursAndMinutes[1]); + + return hours*60 + minutes; + } +} + +class TimeRange { + public Integer startTime; + public Integer endTime; + + public TimeRange(Integer s, Integer e) { + this.startTime = s; + this.endTime = e; + } + + public String toTimeString() { + return this.timeIntegerToMilitaryTime(this.startTime) + "-"+ this.timeIntegerToMilitaryTime(this.endTime); + } + + private String timeIntegerToMilitaryTime(Integer time) { + var hours = time / 60; + var minutes = time % 60; + + var hourString = hours == 0 ? "00" : hours + ""; + var minuteString = minutes == 0 ? "00": minutes + ""; + return hourString+":"+minuteString; } } diff --git a/src/test/java/MainTest.java b/src/test/java/MainTest.java index 679e36c..2510929 100644 --- a/src/test/java/MainTest.java +++ b/src/test/java/MainTest.java @@ -1,6 +1,10 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.lang.reflect.Array; +import java.util.Arrays; +import java.util.List; + import static org.junit.jupiter.api.Assertions.*; class MainTest { @@ -16,4 +20,27 @@ public void setUp() throws Exception{ void testMethod() { assertEquals(codeWorker.testMethod(), "method"); } + + + @Test + void test() { + List schedule1 = Arrays.asList("10:00-11:30", "15:10-16:20"); + List schedule2 = Arrays.asList("8:00-9:30", "12:00-16:00", "17:20-18:00"); + List> schedules = Arrays.asList(schedule1, schedule2); + List bounds = Arrays.asList("8:00","18:00"); + String meetingLength = "0:45"; + + assertEquals(Arrays.asList("16:20-17:20"),codeWorker.getPossibleScheduleTimes(schedules, bounds, meetingLength)); + } + + @Test + void test2() { + List schedule1 = Arrays.asList("10:15-11:30", "15:10-16:20"); + List schedule2 = Arrays.asList("8:45-9:30", "12:00-16:00", "17:10-17:15"); + List> schedules = Arrays.asList(schedule1, schedule2); + List bounds = Arrays.asList("8:00","18:00"); + String meetingLength = "0:45"; + + assertEquals(Arrays.asList("8:00-8:45","9:30-10:15","16:20-17:10","17:15-18:00"),codeWorker.getPossibleScheduleTimes(schedules, bounds, meetingLength)); + } } \ No newline at end of file diff --git a/target/classes/Main.class b/target/classes/Main.class index 1a32117..3dd50d2 100644 Binary files a/target/classes/Main.class and b/target/classes/Main.class differ diff --git a/target/test-classes/MainTest.class b/target/test-classes/MainTest.class index 9fa99ed..349b0ca 100644 Binary files a/target/test-classes/MainTest.class and b/target/test-classes/MainTest.class differ