From 788f4d8b2805f9b9b1b83f6e10bcfdd70bc56e52 Mon Sep 17 00:00:00 2001 From: Hardik Pawar <97388607+Hardvan@users.noreply.github.com> Date: Sat, 26 Oct 2024 14:16:40 +0530 Subject: [PATCH] Enhance docs, add more tests in `NonRepeatingNumberFinder` (#5843) --- .../NonRepeatingNumberFinder.java | 20 +++++++++-- .../NonRepeatingNumberFinderTest.java | 33 +++++++++++++------ 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/thealgorithms/bitmanipulation/NonRepeatingNumberFinder.java b/src/main/java/com/thealgorithms/bitmanipulation/NonRepeatingNumberFinder.java index 07476a8b9..17e1a73ec 100644 --- a/src/main/java/com/thealgorithms/bitmanipulation/NonRepeatingNumberFinder.java +++ b/src/main/java/com/thealgorithms/bitmanipulation/NonRepeatingNumberFinder.java @@ -1,14 +1,30 @@ package com.thealgorithms.bitmanipulation; /** - * Find Non Repeating Number + * A utility class to find the non-repeating number in an array where every other number repeats. + * This class contains a method to identify the single unique number using bit manipulation. + * + * The solution leverages the properties of the XOR operation, which states that: + * - x ^ x = 0 for any integer x (a number XORed with itself is zero) + * - x ^ 0 = x for any integer x (a number XORed with zero is the number itself) + * + * Using these properties, we can find the non-repeating number in linear time with constant space. + * + * Example: + * Given the input array [2, 3, 5, 2, 3], the output will be 5 since it does not repeat. + * * @author Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi) */ - public final class NonRepeatingNumberFinder { private NonRepeatingNumberFinder() { } + /** + * Finds the non-repeating number in the given array. + * + * @param arr an array of integers where every number except one appears twice + * @return the integer that appears only once in the array or 0 if the array is empty + */ public static int findNonRepeatingNumber(int[] arr) { int result = 0; for (int num : arr) { diff --git a/src/test/java/com/thealgorithms/bitmanipulation/NonRepeatingNumberFinderTest.java b/src/test/java/com/thealgorithms/bitmanipulation/NonRepeatingNumberFinderTest.java index 1addde057..fe2136fd7 100644 --- a/src/test/java/com/thealgorithms/bitmanipulation/NonRepeatingNumberFinderTest.java +++ b/src/test/java/com/thealgorithms/bitmanipulation/NonRepeatingNumberFinderTest.java @@ -2,22 +2,35 @@ package com.thealgorithms.bitmanipulation; import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; /** * Test case for Non Repeating Number Finder + * This test class validates the functionality of the + * NonRepeatingNumberFinder by checking various scenarios. + * * @author Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi) */ - class NonRepeatingNumberFinderTest { - @Test - void testNonRepeatingNumberFinder() { - int[] arr = {1, 2, 1, 2, 6}; - assertEquals(6, NonRepeatingNumberFinder.findNonRepeatingNumber(arr)); - int[] arr1 = {1, 2, 1, 2}; - assertEquals(0, NonRepeatingNumberFinder.findNonRepeatingNumber(arr1)); - int[] arr2 = {12}; - assertEquals(12, NonRepeatingNumberFinder.findNonRepeatingNumber(arr2)); + @ParameterizedTest + @MethodSource("testCases") + void testNonRepeatingNumberFinder(int[] arr, int expected) { + assertEquals(expected, NonRepeatingNumberFinder.findNonRepeatingNumber(arr)); + } + + private static Arguments[] testCases() { + return new Arguments[] { + Arguments.of(new int[] {1, 2, 1, 2, 6}, 6), Arguments.of(new int[] {1, 2, 1, 2}, 0), // All numbers repeat + Arguments.of(new int[] {12}, 12), // Single non-repeating number + Arguments.of(new int[] {3, 5, 3, 4, 4}, 5), // More complex case + Arguments.of(new int[] {7, 8, 7, 9, 8, 10, 10}, 9), // Non-repeating in the middle + Arguments.of(new int[] {0, -1, 0, -1, 2}, 2), // Testing with negative numbers + Arguments.of(new int[] {Integer.MAX_VALUE, 1, 1}, Integer.MAX_VALUE), // Edge case with max int + Arguments.of(new int[] {2, 2, 3, 3, 4, 5, 4}, 5), // Mixed duplicates + Arguments.of(new int[] {}, 0) // Edge case: empty array (should be handled as per design) + }; } }