From ee7f603ad262850de77ca9073dbea949ba99a50e Mon Sep 17 00:00:00 2001 From: Andrei Ovcharenko Date: Sat, 1 Aug 2026 04:51:57 +0300 Subject: [PATCH] Prevent overflow in sliding average updates --- src/main/java/algorithms/sprint0/SlidingAverage.java | 2 +- src/test/java/algorithms/sprint0/SlidingAverageTest.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/algorithms/sprint0/SlidingAverage.java b/src/main/java/algorithms/sprint0/SlidingAverage.java index 868506e..189fb1f 100644 --- a/src/main/java/algorithms/sprint0/SlidingAverage.java +++ b/src/main/java/algorithms/sprint0/SlidingAverage.java @@ -28,7 +28,7 @@ static List movingAverage(int n, List arr, int windowSize) { } result.add(sum / (double) windowSize); for (int i = windowSize; i < minSize; i++) { - sum += arr.get(i) - arr.get(i - windowSize); + sum += (long) arr.get(i) - arr.get(i - windowSize); result.add(sum / (double) windowSize); } return result; diff --git a/src/test/java/algorithms/sprint0/SlidingAverageTest.java b/src/test/java/algorithms/sprint0/SlidingAverageTest.java index 7042b1f..5dbcd44 100644 --- a/src/test/java/algorithms/sprint0/SlidingAverageTest.java +++ b/src/test/java/algorithms/sprint0/SlidingAverageTest.java @@ -49,6 +49,13 @@ void largeValuesDoNotOverflowTheWindowSum() { assertListDoubles(SlidingAverage.movingAverage(4, List.of(max, max, max, max), 2), max, max, max); } + @Test + void extremeValuesDoNotOverflowTheRollingUpdate() { + assertListDoubles(SlidingAverage.movingAverage( + 2, List.of(Integer.MIN_VALUE, Integer.MAX_VALUE), 1), + Integer.MIN_VALUE, Integer.MAX_VALUE); + } + private static void assertListDoubles(List actual, double... expected) { assertEquals(expected.length, actual.size(), "size"); for (int i = 0; i < expected.length; i++) {