diff --git a/Maths/NonRepeatingElement.java b/Maths/NonRepeatingElement.java new file mode 100644 index 000000000..e332d8e80 --- /dev/null +++ b/Maths/NonRepeatingElement.java @@ -0,0 +1,71 @@ +package Maths; +import java.util.Scanner; + +/* + * Find the 2 elements which are non repeating in an array + * Reason to use bitwise operator: It makes our program faster as we are operating on bits and not on + * actual numbers. + */ +public class NonRepeatingElement { + + public static void main(String[] args) { + + Scanner sc = new Scanner(System.in); + int i, res = 0; + System.out.println("Enter the number of elements in the array"); + int n = sc.nextInt(); + if((n & 1) == 1) + { + //Not allowing odd number of elements as we are expecting 2 non repeating numbers + System.out.println("Array should contain even number of elements"); + return; + } + int arr[] = new int[n]; + + System.out.println("Enter "+n+" elements in the array. NOTE: Only 2 elements should not repeat"); + for(i = 0; i 0)//Case 1 explained below + num1^=arr[i]; + else + num2^=arr[i];//Case 2 explained below + + } + + System.out.println("The two non repeating elements are "+num1+" and "+num2); + + } + + /* + Explanation of the code: + let us assume we have an array [1,2,1,2,3,4] + Property of XOR: num ^ num = 0. + If we XOR all the elemnets of the array we will be left with 3 ^ 4 as 1 ^ 1 and 2 ^ 2 would give 0. + Our task is to find num1 and num2 from the result of 3 ^ 4 = 7. + We need to find two's complement of 7 and find the rightmost set bit. i.e. (num & (-num)) + Two's complement of 7 is 001 and hence res = 1. + There can be 2 options when we Bitise AND this res with all the elements in our array + 1. Result will come non zero number + 2. Result will be 0. + In the first case we will XOR our element with the first number (which is initially 0) + In the second case we will XOR our element with the second number(which is initially 0) + This is how we will get non repeating elements with the help of bitwise operators. + */ +}