mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-06 17:29:31 +08:00
Enhance docs, add more tests in NonRepeatingNumberFinder
(#5843)
This commit is contained in:
@ -1,14 +1,30 @@
|
|||||||
package com.thealgorithms.bitmanipulation;
|
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)
|
* @author Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public final class NonRepeatingNumberFinder {
|
public final class NonRepeatingNumberFinder {
|
||||||
private 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) {
|
public static int findNonRepeatingNumber(int[] arr) {
|
||||||
int result = 0;
|
int result = 0;
|
||||||
for (int num : arr) {
|
for (int num : arr) {
|
||||||
|
@ -2,22 +2,35 @@ package com.thealgorithms.bitmanipulation;
|
|||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
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
|
* 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)
|
* @author Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class NonRepeatingNumberFinderTest {
|
class NonRepeatingNumberFinderTest {
|
||||||
|
|
||||||
@Test
|
@ParameterizedTest
|
||||||
void testNonRepeatingNumberFinder() {
|
@MethodSource("testCases")
|
||||||
int[] arr = {1, 2, 1, 2, 6};
|
void testNonRepeatingNumberFinder(int[] arr, int expected) {
|
||||||
assertEquals(6, NonRepeatingNumberFinder.findNonRepeatingNumber(arr));
|
assertEquals(expected, NonRepeatingNumberFinder.findNonRepeatingNumber(arr));
|
||||||
int[] arr1 = {1, 2, 1, 2};
|
}
|
||||||
assertEquals(0, NonRepeatingNumberFinder.findNonRepeatingNumber(arr1));
|
|
||||||
int[] arr2 = {12};
|
private static Arguments[] testCases() {
|
||||||
assertEquals(12, NonRepeatingNumberFinder.findNonRepeatingNumber(arr2));
|
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)
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user