The challenge
You are given an array of unique elements, and your task is to rearrange the values so that the first max value is followed by the first minimum, followed by second max value then second min value, etc.
For example:
solve([15,11,10,7,12]) = [15,7,12,10,11]
The first max is 15
and the first min is 7
. The second max is 12
and the second min is 10
and so on.
The solution in Java code
Option 1:
import java.util.*;
class Solution{
public static int[] solve (int[] arr){
Arrays.sort(arr);
int[] solutionArray = new int[arr.length];
for(int i = 0; i < arr.length; i++){
solutionArray[i] = i % 2 == 0 ? arr[arr.length - i/2 - 1] : arr[i/2];
}
return solutionArray;
}
}
Option 2:
import java.util.*;
class Solution{
public static int[] solve (int[] arr){
List<Integer> temp = new ArrayList<Integer>();
Arrays.sort(arr);
for (int i = 0, j = arr.length - 1; i <= j; ++i, --j) {
if (i != j) temp.add(arr[j]);
temp.add(arr[i]);
}
return temp.stream().mapToInt(i -> i).toArray();
}
}
Option 3:
import java.util.stream.IntStream;
class Solution {
public static int[] solve(int[] arr) {
int[] sorted = IntStream.of(arr).sorted().toArray();
int[] result = new int[arr.length];
for (int i = 0, j = arr.length - 1, f = -1; i < arr.length;) {
result[i] = sorted[j];
j = (j + arr.length + (f *= -1) * (++i)) % arr.length;
}
return result;
}
}
Test cases to validate our solution
import org.junit.Test;
import static org.junit.Assert.assertArrayEquals;
import org.junit.runners.JUnit4;
public class SolutionTest{
@Test
public void basicTests(){
assertArrayEquals(new int[]{15,7,12,10,11},Solution.solve(new int[]{15,11,10,7,12}));
assertArrayEquals(new int[]{15,7,12,10,11},Solution.solve(new int[]{15,11,10,7,12}));
assertArrayEquals(new int[]{15,7,12,10,11},Solution.solve(new int[]{15,11,10,7,12}));
}
}