diff --git a/core-java-modules/core-java-arrays-operations-advanced-2/src/main/java/com/baeldung/closesttozero/BruteForce.java b/core-java-modules/core-java-arrays-operations-advanced-2/src/main/java/com/baeldung/closesttozero/BruteForce.java new file mode 100644 index 000000000000..e0fce4bcb9f9 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced-2/src/main/java/com/baeldung/closesttozero/BruteForce.java @@ -0,0 +1,18 @@ +package com.baeldung.closesttozero; + +public class BruteForce { + + public static int findClosestToZero(int[] arr) throws IllegalAccessException { + if (arr == null || arr.length == 0) { + throw new IllegalAccessException("Array must not be null or Empty"); + } + + int closest = arr[0]; + for (int i = 1; i < arr.length; i++) { + if ((Math.abs(arr[i]) < Math.abs(closest)) || ((Math.abs(arr[i]) == Math.abs(closest)) && (arr[i] > closest))) { + closest = arr[i]; + } + } + return closest; + } +} diff --git a/core-java-modules/core-java-arrays-operations-advanced-2/src/main/java/com/baeldung/closesttozero/PriorityQueueToZero.java b/core-java-modules/core-java-arrays-operations-advanced-2/src/main/java/com/baeldung/closesttozero/PriorityQueueToZero.java new file mode 100644 index 000000000000..5c76c9278ff9 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced-2/src/main/java/com/baeldung/closesttozero/PriorityQueueToZero.java @@ -0,0 +1,22 @@ +package com.baeldung.closesttozero; + +import java.util.PriorityQueue; + +public class PriorityQueueToZero { + public static int findClosestToZeroWithPriorityQueue(int[] arr, int k) { + if (arr == null || arr.length == 0 || k <= 0) { + throw new IllegalArgumentException("Invalid input"); + } + + PriorityQueue pq = new PriorityQueue<>((a, b) -> Math.abs(b) - Math.abs(a)); + + for (int num : arr) { + pq.offer(num); + if (pq.size() > k) { + pq.poll(); + } + } + + return pq.peek(); + } +} diff --git a/core-java-modules/core-java-arrays-operations-advanced-2/src/main/java/com/baeldung/closesttozero/SortingAndBinarySearch.java b/core-java-modules/core-java-arrays-operations-advanced-2/src/main/java/com/baeldung/closesttozero/SortingAndBinarySearch.java new file mode 100644 index 000000000000..8e6be73a3543 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced-2/src/main/java/com/baeldung/closesttozero/SortingAndBinarySearch.java @@ -0,0 +1,35 @@ +package com.baeldung.closesttozero; + +import java.util.Arrays; + +public class SortingAndBinarySearch { + + public static int findClosestToZero(int[] arr) { + if (arr == null || arr.length == 0) { + throw new IllegalArgumentException("Array must not be null or Empty"); + } + + Arrays.sort(arr); + int closestNumber = arr[0]; + int left = 0; + int right = arr.length - 1; + + while (left <= right) { + int mid = left + (right - left) / 2; + + if (Math.abs(arr[mid]) < Math.abs(closestNumber)) { + closestNumber = arr[mid]; + } + + if (arr[mid] < 0) { + left = mid + 1; + } else if (arr[mid] > 0) { + right = mid - 1; + } else { + return arr[mid]; + } + } + + return closestNumber; + } +} diff --git a/core-java-modules/core-java-arrays-operations-advanced-2/src/test/java/com/baeldung/closesttozero/BruteForceUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced-2/src/test/java/com/baeldung/closesttozero/BruteForceUnitTest.java new file mode 100644 index 000000000000..ae34a42ee835 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced-2/src/test/java/com/baeldung/closesttozero/BruteForceUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.closesttozero; + +import org.junit.jupiter.api.Test; + +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class BruteForceUnitTest { + + @Test + void whenFindingClosestToZeroWithBruteForce_thenResultShouldBeCorrect() throws IllegalAccessException { + int[] arr = {11, 60, -1, 70, -11, 85}; + assertEquals(-1, BruteForce.findClosestToZero(arr)); + } +} diff --git a/core-java-modules/core-java-arrays-operations-advanced-2/src/test/java/com/baeldung/closesttozero/PriorityQueueTOZeroUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced-2/src/test/java/com/baeldung/closesttozero/PriorityQueueTOZeroUnitTest.java new file mode 100644 index 000000000000..8e8ab9c94678 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced-2/src/test/java/com/baeldung/closesttozero/PriorityQueueTOZeroUnitTest.java @@ -0,0 +1,16 @@ +package com.baeldung.closesttozero; + +import org.junit.jupiter.api.Test; + +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class PriorityQueueTOZeroUnitTest { + @Test + void whenFindingClosestToZeroWithBruteForce_thenResultShouldBeCorrect() throws IllegalAccessException { + int[] arr = {1, 60, -10, 70, -80, 85}; + assertEquals(1, PriorityQueueToZero.findClosestToZeroWithPriorityQueue(arr, 1)); + } +} diff --git a/core-java-modules/core-java-arrays-operations-advanced-2/src/test/java/com/baeldung/closesttozero/SortingAndBinarySearchUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced-2/src/test/java/com/baeldung/closesttozero/SortingAndBinarySearchUnitTest.java new file mode 100644 index 000000000000..320b6ed65cad --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced-2/src/test/java/com/baeldung/closesttozero/SortingAndBinarySearchUnitTest.java @@ -0,0 +1,15 @@ +package com.baeldung.closesttozero; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class SortingAndBinarySearchUnitTest { + + @Test + void whenFindingClosestToZeroWithBruteForce_thenResultShouldBeCorrect() throws IllegalAccessException { + int[] arr = {1, 60, -10, 70, -80, 85}; + assertEquals(1, SortingAndBinarySearch.findClosestToZero(arr)); + } + +}