Skip to content

Commit e9f11bb

Browse files
authored
Fix incorrect absolute minimum calculation (#7536)
* Fix incorrect absolute minimum calculation * Fix incorrect absolute minimum calculation * Handle Integer.MIN_VALUE overflow in AbsoluteMin
1 parent 8a20fa9 commit e9f11bb

2 files changed

Lines changed: 24 additions & 11 deletions

File tree

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.thealgorithms.maths;
22

3-
import java.util.Arrays;
4-
53
public final class AbsoluteMin {
64
private AbsoluteMin() {
75
}
@@ -13,14 +11,17 @@ private AbsoluteMin() {
1311
* @return The absolute min value
1412
*/
1513
public static int getMinValue(int... numbers) {
16-
if (numbers.length == 0) {
17-
throw new IllegalArgumentException("Numbers array cannot be empty");
14+
if (numbers == null || numbers.length == 0) {
15+
throw new IllegalArgumentException("Numbers array cannot be empty or null");
1816
}
1917

20-
var absMinWrapper = new Object() { int value = numbers[0]; };
21-
22-
Arrays.stream(numbers).skip(1).filter(number -> Math.abs(number) <= Math.abs(absMinWrapper.value)).forEach(number -> absMinWrapper.value = Math.min(absMinWrapper.value, number));
23-
24-
return absMinWrapper.value;
18+
long absMin = numbers[0];
19+
for (int i = 1; i < numbers.length; i++) {
20+
long current = numbers[i];
21+
if (Math.abs(current) < Math.abs(absMin) || (Math.abs(current) == Math.abs(absMin) && current < absMin)) {
22+
absMin = current;
23+
}
24+
}
25+
return (int) absMin;
2526
}
2627
}

src/test/java/com/thealgorithms/maths/AbsoluteMinTest.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,29 @@ public class AbsoluteMinTest {
1111
void testGetMinValue() {
1212
assertEquals(0, AbsoluteMin.getMinValue(4, 0, 16));
1313
assertEquals(-2, AbsoluteMin.getMinValue(3, -10, -2));
14+
assertEquals(-2, AbsoluteMin.getMinValue(-3, -10, -2));
15+
assertEquals(2, AbsoluteMin.getMinValue(-3, -10, 2));
16+
assertEquals(2, AbsoluteMin.getMinValue(-5, 2));
17+
assertEquals(2, AbsoluteMin.getMinValue(2, -5));
1418
}
1519

1620
@Test
1721
void testGetMinValueWithNoArguments() {
18-
Exception exception = assertThrows(IllegalArgumentException.class, AbsoluteMin::getMinValue);
19-
assertEquals("Numbers array cannot be empty", exception.getMessage());
22+
assertThrows(IllegalArgumentException.class, AbsoluteMin::getMinValue);
2023
}
2124

2225
@Test
2326
void testGetMinValueWithSameAbsoluteValues() {
2427
assertEquals(-5, AbsoluteMin.getMinValue(-5, 5));
2528
assertEquals(-5, AbsoluteMin.getMinValue(5, -5));
2629
}
30+
31+
@Test
32+
void testIntegerMinValueOverflow() {
33+
assertEquals(1, AbsoluteMin.getMinValue(Integer.MIN_VALUE, 1));
34+
assertEquals(-1, AbsoluteMin.getMinValue(Integer.MIN_VALUE, -1));
35+
assertEquals(0, AbsoluteMin.getMinValue(Integer.MIN_VALUE, 0));
36+
assertEquals(Integer.MIN_VALUE, AbsoluteMin.getMinValue(Integer.MIN_VALUE));
37+
assertEquals(Integer.MAX_VALUE, AbsoluteMin.getMinValue(Integer.MIN_VALUE, Integer.MAX_VALUE));
38+
}
2739
}

0 commit comments

Comments
 (0)