Last active
October 16, 2018 09:44
-
-
Save edwingsm/bde126b55b4354d2bdaefb4681258996 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.spring.integration.springintegrationdemo; | |
import java.util.Arrays; | |
import java.util.stream.IntStream; | |
public class EarlyTime { | |
public static void main(String[] args) { | |
long t1 = System.currentTimeMillis(); | |
System.out.println(solution(1, 8, 2, 3, 6, 4)); | |
System.out.println(solution(0, 0, 0, 7, 8, 9));// goes to nums[3]>6 | |
System.out.println(solution(0, 1, 2, 7, 8, 9));// goes to nums[3]>6 | |
System.out.println(solution(2, 4, 5, 9, 5, 9));// Invalid time | |
System.out.println(solution(2, 5, 5, 9, 5, 9));// Invalid time | |
System.out.println(solution(6, 5, 4, 3, 2, 1));// Happy path | |
System.out.println(solution(8, 1, 2, 4, 3, 6)); | |
System.out.println(solution(9, 2, 8, 6, 7, 0));// Invalid time | |
System.out.println(solution(0, 0, 0, 0, 0, 0));// end points | |
System.out.println(solution(0, 0, 0, 0, 0, 1));// Happy Path | |
System.out.println(solution(2, 3, 5, 9, 5, 9));// goes to nums[3]<6 , endpoints | |
System.out.println(solution(0, 0, 2, 4, 0, 0));// Happy path | |
System.out.println(solution(4, 4, 4, 5, 9, 9));// Invalid time | |
// System.out.println(solution(4, -1, 4, 5, 9, 9));// Invalid time | |
long t2 = System.currentTimeMillis(); | |
System.out.println(t2 - t1); | |
System.out.println("--------------------------------"); | |
t1 = System.currentTimeMillis(); | |
System.out.println(solve(1, 8, 2, 3, 6, 4)); | |
System.out.println(solve(0, 0, 0, 7, 8, 9));// goes to nums[3]>6 | |
System.out.println(solve(0, 1, 2, 7, 8, 9));// goes to nums[3]>6 | |
System.out.println(solve(2, 4, 5, 9, 5, 9));// Invalid time | |
System.out.println(solve(2, 5, 5, 9, 5, 9));// Invalid time | |
System.out.println(solve(6, 5, 4, 3, 2, 1));// Happy path | |
System.out.println(solve(8, 1, 2, 4, 3, 6)); | |
System.out.println(solve(9, 2, 8, 6, 7, 0));// Invalid time | |
System.out.println(solve(0, 0, 0, 0, 0, 0));// end points | |
System.out.println(solve(0, 0, 0, 0, 0, 1));// Happy Path | |
System.out.println(solve(2, 3, 5, 9, 5, 9));// goes to nums[3]<6 , endpoints | |
System.out.println(solve(0, 0, 2, 4, 0, 0));// Happy path | |
System.out.println(solve(4, 4, 4, 5, 9, 9));// Invalid time | |
t2 = System.currentTimeMillis(); | |
System.out.println(t2 - t1); | |
System.out.println("--------------------------------"); | |
t1 = System.currentTimeMillis(); | |
System.out.println(solve_StringBuilder(1, 8, 2, 3, 6, 4)); | |
System.out.println(solve_StringBuilder(0, 0, 0, 7, 8, 9));// goes to nums[3]>6 | |
System.out.println(solve_StringBuilder(0, 1, 2, 7, 8, 9));// goes to nums[3]>6 | |
System.out.println(solve_StringBuilder(2, 4, 5, 9, 5, 9));// Invalid time | |
System.out.println(solve_StringBuilder(2, 5, 5, 9, 5, 9));// Invalid time | |
System.out.println(solve_StringBuilder(6, 5, 4, 3, 2, 1));// Happy path | |
System.out.println(solve_StringBuilder(8, 1, 2, 4, 3, 6)); | |
System.out.println(solve_StringBuilder(9, 2, 8, 6, 7, 0));// Invalid time | |
System.out.println(solve_StringBuilder(0, 0, 0, 0, 0, 0));// end points | |
System.out.println(solve_StringBuilder(0, 0, 0, 0, 0, 1));// Happy Path | |
System.out.println(solve_StringBuilder(2, 3, 5, 9, 5, 9));// goes to nums[3]<6 , endpoints | |
System.out.println(solve_StringBuilder(0, 0, 2, 4, 0, 0));// Happy path | |
System.out.println(solve_StringBuilder(4, 4, 4, 5, 9, 9));// Invalid time | |
t2 = System.currentTimeMillis(); | |
System.out.println(t2 - t1); | |
// System.out.println(solve(4, -1, 4, 5, 9, 9));// Invalid time | |
} | |
public static String solution(int A, int B, int C, int D, int E, int F) { | |
// We need minimum of 2 integers in range [0,3] to make a valid hour | |
// We need minimum of 3 integers [0,5] to make valid seconds,min,hour | |
// Sort the number in ASC order | |
int[] nums = IntStream.of(A, B, C, D, E, F).filter(n -> n >= 0).sorted().toArray(); | |
if (nums.length != 6) | |
return "NOT POSSIBLE"; | |
int[] splittedTime = new int[] { nums[0] * 10 + nums[1], nums[2] * 10 + nums[3], nums[4] * 10 + nums[5] }; | |
// splittedTime[0]=hour:splittedTime[1]=minutes:splittedTime[2]=seconds | |
if (!validateHour(splittedTime[0]) || !validateMinute(splittedTime[1])) { | |
// This means among given 6 integers , 5 integers are > 3, so can't make up a | |
// valid hour under 24 "OR" | |
// This means among given 6 integers, 4 integers are greater than > 5, so can't | |
// make up valid minutes, seconds | |
return "NOT POSSIBLE"; | |
} | |
// Once the above condition passed, that means we have satisfied 2 rules, we can | |
// make valid time with given set of integers . | |
// It might/might not need some re-arrangement in order of elements in array to | |
// get earliest time | |
if (!validateSecond(splittedTime[2])) { | |
if (nums[3] < 6) { | |
// swapping maximum from minute with, minimum from second | |
int swapMin = nums[4]; | |
int swapSecond = nums[3]; | |
nums[3] = swapMin; | |
nums[4] = swapSecond; | |
// Can directly assign no need to keep it in temp variable | |
} else if (nums[3] > 6) { | |
// Kind of circular swapping between hour, minute and second | |
int[] firstHalf = Arrays.copyOfRange(nums, 0, nums.length / 2); | |
int[] secondHalf = Arrays.copyOfRange(nums, nums.length / 2, nums.length); | |
nums = IntStream | |
.of(firstHalf[0], secondHalf[0], firstHalf[1], secondHalf[1], firstHalf[2], secondHalf[2]) | |
.toArray(); | |
} | |
} | |
return String.format("%1$d%2$d:%3$d%4$d:%5$d%6$d", nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]); | |
} | |
public static boolean validateHour(int hour) { | |
return hour < 24; | |
} | |
public static boolean validateMinute(int minute) { | |
return minute < 60; | |
} | |
public static boolean validateSecond(int second) { | |
return second < 60; | |
} | |
public static String solve(int A, int B, int C, int D, int E, int F) { | |
int[] d = IntStream.of(A, B, C, D, E, F).filter(n -> n >= 0).sorted().toArray(); | |
final String timeSeparator = ":"; | |
StringBuilder builder = new StringBuilder(); | |
if (d[4] < 6) { // 2nd largest digit is smaller 6, we can just fill up | |
if (10 * d[0] + d[1] < 24) | |
return "" + d[0] + d[1] + ":" + d[2] + d[3] + ":" + d[4] + d[5]; | |
else | |
return "impossible"; | |
} else if (d[3] < 6) { // 3rd largest digit is smaller 6, put 2nd largest in 4th position | |
if (10 * d[0] + d[1] < 24) | |
return "" + d[0] + d[1] + ":" + d[2] + d[4] + ":" + d[3] + d[5]; | |
else | |
return "impossible"; | |
} else if (d[2] < 6) { // 4th largest digit is smaller 6, put 3rd largest in 2nd position | |
if (10 * d[0] + d[3] < 24) | |
return "" + d[0] + d[3] + ":" + d[1] + d[4] + ":" + d[2] + d[5]; | |
else | |
return "impossible"; | |
} else { | |
return "impossible"; | |
} | |
} | |
public static String solve_StringBuilder(int A, int B, int C, int D, int E, int F) { | |
int[] d = IntStream.of(A, B, C, D, E, F).filter(n -> n >= 0).sorted().toArray(); | |
final String timeSeparator = ":"; | |
StringBuilder builder = new StringBuilder("impossible"); | |
if (d[4] < 6) { // 2nd largest digit is smaller 6, we can just fill up | |
if (10 * d[0] + d[1] < 24) { | |
builder.setLength(0); | |
builder.append(d[0]).append(d[1]).append(timeSeparator).append(d[2]).append(d[3]).append(timeSeparator) | |
.append(d[4]).append(d[5]); | |
} | |
} else if (d[3] < 6) { // 3rd largest digit is smaller 6, put 2nd largest in 4th position | |
if (10 * d[0] + d[1] < 24) { | |
builder.setLength(0); | |
builder.append(d[0]).append(d[1]).append(timeSeparator).append(d[2]).append(d[4]).append(timeSeparator) | |
.append(d[3]).append(d[5]); | |
} | |
} else if (d[2] < 6) { // 4th largest digit is smaller 6, put 3rd largest in 2nd position | |
if (10 * d[0] + d[3] < 24) { | |
builder.setLength(0); | |
builder.append(d[0]).append(d[3]).append(timeSeparator).append(d[1]).append(d[4]).append(timeSeparator) | |
.append(d[2]).append(d[5]); | |
} | |
} | |
return builder.toString(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment