Skip to content

refactor: Enhance docs, add more tests in NonRepeatingNumberFinder #5843

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Oct 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,35 @@

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)
};
}
}