Works application 2014笔试题(1)
Implement the method "getMaxIntervalOverlapCount" in the class "Problem1".
int Problem1#getMaxIntervalOverlapCount(List<Interval> intervals)
<Specifications>
? Return 0 if the argument is null or an empty list.
? The argument (a list of “intervals”) must not contain null.
<Examples>
In Figure 1, two “intervals” are overlapped at most. ? Return “2” for this case.
In Figure 2, three “intervals” are overlapped at most. ? Return “3” for this case.
<Examples of test>
The class “Problem1”, which you have created in this problem, is to be tested as following.
@Test
public void testProblem1Usage() {
Problem1 p = new Problem1();
// example: Figure 1
Interval interval1 = new Interval("08:00", "12:00");
Interval interval2 = new Interval("06:00", "09:00");
Interval interval3 = new Interval("11:00", "13:30");
List<Interval> figure1 = Arrays.asList(interval1, interval2, interval3);
assertThat(p.getMaxIntervalOverlapCount(figure1), is(2));
// example: Figure 2
List<Interval> figure2 = Arrays.asList(new Interval("09:00", "12:30"),
new Interval("06:00", "09:30"), new Interval("12:00", "14:30"),
new Interval("10:00", "10:30"), new Interval("11:00", "13:30"));
assertThat(p.getMaxIntervalOverlapCount(figure2), is(3));
}
下面是个人解答,做的一般,反正目前是没有收到面试通知
package jp.co.wap.exam; import java.util.Iterator; import java.util.List; import jp.co.wap.exam.lib.Interval; //This class is tested in testProblems.testProblem1Usage(); public class Problem1 { public int getMaxIntervalOverlapCount(List<Interval> intervals) { // TODO: Implement this method. if( intervals == null || intervals.isEmpty()) return 0; for( Object interval: intervals) if( interval == null) throw new IllegalArgumentException(); Iterator<Interval> it = intervals.iterator(); int position = 0; int count; //Use a string array to record the overlap intervals. String positionRelation[] = new String[intervals.size()]; for( ; it.hasNext(); ){ count = 1; Interval curInterval = (Interval) it.next(); for( Object interval: intervals){ Interval myInterval = (Interval) interval; if( myInterval.getBeginMinuteUnit() <= curInterval.getEndMinuteUnit() && myInterval.getEndMinuteUnit() >= curInterval.getBeginMinuteUnit() ) if(positionRelation[position] == null) positionRelation[position] = String.valueOf(count); else positionRelation[position] += String.valueOf(count); count ++; } position ++; //This can show the overlap conditions. //System.out.println(positionRelation[position]); } //count the max overlap of the records int maxOverlap = 0; int overlapRecord; int countContain; for( int i = 0; i < positionRelation.length; i++){ overlapRecord = 0; for ( int j = 0; j < positionRelation.length; j++){ //Code beneath is to validate a piece of overlap record //is contained by another record countContain = 0; for ( int k = 0; k < positionRelation[i].length(); k++) if( positionRelation[j].contains(String.valueOf(positionRelation[i].charAt(k)))) countContain ++; if(countContain == positionRelation[i].length()) overlapRecord ++; } //If a record is fully contained by another, //and the count lager than length of the record //it means the intervals in a record are overlapped. if ( overlapRecord >= positionRelation[i].length() && maxOverlap < positionRelation[i].length()) maxOverlap = positionRelation[i].length(); } return maxOverlap; } }
lib是已经提供好了的
package jp.co.wap.exam.lib; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * This class represents interval. * YOU MUST NOT MODIFY THIS CLASS. (Use this as it is) * You do not have to submit this class. (Interval class is to be provided in our scoring system.) */ public class Interval { /** * It represents Time of Hour and Minute. */ private static class Time { final int hour; final int minute; public Time(int hour, int minute) { this.hour = hour; this.minute = minute; } @Override public String toString() { return String.format("%02d:%02d", hour, minute); } @Override public int hashCode() { return toString().hashCode(); } @Override public boolean equals(Object obj) { if (!(obj instanceof Time)) { return false; } Time other = (Time) obj; return (this.hour == other.hour && this.minute == other.minute); } } /** Initial point of interval. */ private final Time begin; /** Terminal point of interval. */ private final Time end; /** Create interval from begin time (string) and end time (string). */ public Interval(String begin, String end) { this.begin = toTime(begin); this.end = toTime(end); } /** Convert time format (string) to Time structure. */ private static Time toTime(String timeFormatString) { Pattern p = Pattern.compile("(\\d?\\d):([0-5]\\d)"); Matcher m = p.matcher(timeFormatString); if (!m.find()) { throw new IllegalArgumentException("invalid time format."); } int hour = Integer.parseInt(m.group(1)); int minute = Integer.parseInt(m.group(2)); return new Time(hour, minute); } /** Get interval begin string.*/ public String getBegin() { return this.begin.toString(); } /** Get interval end string. */ public String getEnd() { return this.end.toString(); } /** Get interval begin hour. */ public int getBeginHour() { return this.begin.hour; } /** Get interval begin minute. */ public int getBeginMinute() { return this.begin.minute; } /** Get interval end hour. */ public int getEndHour() { return this.end.hour; } /** Get interval end minute. */ public int getEndMinute() { return this.end.minute; } /** * Get total time (minute) from "00:00" to initial point of interval. * For example, it returns 150 when initial point of interval is "02:30". **/ public int getBeginMinuteUnit() { return getBeginHour() * 60 + getBeginMinute(); } /** * Get total time (minute) from "00:00" to terminal point of interval. * For example, it returns 1440 when terminal point of interval is "24:00". **/ public int getEndMinuteUnit() { return getEndHour() * 60 + getEndMinute(); } /** * Get total time on interval. * That is, it returns getEndMinuteUnit() minus getBeginMinuteUnit(). **/ public int getIntervalMinute() { return getEndMinuteUnit() - getBeginMinuteUnit(); } @Override public int hashCode() { return toString().hashCode(); } @Override public boolean equals(Object obj) { if (!(obj instanceof Interval)) { return false; } Interval other = (Interval) obj; return (this.begin.equals(other.begin) && this.end.equals(other.end)); } @Override public String toString() { return String.format("[%s-%s]", begin, end); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。