Find the two non-repeating elements in an array of repeating elements/ Unique Numbers 2 - GeeksforGeeks

13 May, 2022
Asked by SG Given an array in which all numbers except two are repeated once. (i.e. we have 2n+2 numbers and n numbers are occurring twice and remaining two have occurred once). Find those two numbers in the most efficient way.  
Method 1(Use Sorting) First, sort all the elements. In the sorted array, by comparing adjacent elements we can easily get the non-repeating elements. Time complexity of this method is O(nLogn)
Method 2(Use XOR) Let x and y be the non-repeating elements we are looking for and arr[] be the input array. First, calculate the XOR of all the array elements. 
     xor = arr[0]^arr[1]^arr[2].....arr[n-1]
All the bits that are set in xor will be set in one non-repeating element (x or y) and not in others. So if we take any set bit of xor and divide the elements of the array in two sets – one set of elements with same bit set and another set with same bit not set. By doing so, we will get x in one set and y in another set. Now if we do XOR of all the elements in the first set, we will get the first non-repeating element, and by doing same in other sets we will get the second non-repeating element. 
Let us see an example.
   arr[] = {2, 4, 7, 9, 2, 4}
1) Get the XOR of all the elements.
     xor = 2^4^7^9^2^4 = 14 (1110)
2) Get a number which has only one set bit of the xor.   
   Since we can easily get the rightmost set bit, let us use it.
     set_bit_no = xor & ~(xor-1) = (1110) & ~(1101) = 0010
   Now set_bit_no will have only set as rightmost set bit of xor.
3) Now divide the elements in two sets and do xor of         
   elements in each set and we get the non-repeating 
   elements 7 and 9. Please see the implementation for this step.
Approach : Step 1: Xor all the elements of the array into a variable sum thus all the elements present twice in an array will get removed as for example, 4 = “100” and if 4 xor 4 => “100” xor “100” thus answer will be “000”. Step 2: Thus in the sum the final answer will be 3 xor 5 as both 2 and 4 are xor with itself giving 0, therefore sum = “011” xor “101” i.e sum = “110” = 6. Step 3: Now we will take 2’s Complement of sum i.e (-sum) = “010”. Step 4: Now bitwise And the 2’s of sum with the sum i.e “110” & “010” gives the answer “010” (Aim for bitwise & is that we want to get a number that contains only the rightmost set bit of the sum). Step 5: bitwise & all the elements of the array with this obtained sum, 2 = “010” & “010” = 2, 3 = “011” & “010” = “010” , 4 = “100” & “010” = “000”, 5 = “101” & “010” = “000”. Step 6: As we can see that the bitwise & of 2,3 > 0 thus they will be xor with sum1 and bitwise & of 4,5 is resulting into 0 thus they will be xor with sum2. Step 7: As 2 is present two times so getting xor with sum1 two times only the result 3 is being stored in it and As 4 is also present two times thus getting xor with sum2 will cancel it’s value and thus only 5 will remain there.
Implementation: 
C++
C
Java
Python3
C#
Javascript
// C++ program for above approach#include <bits/stdc++.h>using namespace std; /* This function sets the values of*x and *y to non-repeating elementsin an array arr[] of size n*/void get2NonRepeatingNos(int arr[], int n, int* x, int* y){    /* Will hold Xor of all elements */    int Xor = arr[0];     /* Will have only single set bit of Xor */    int set_bit_no;    int i;    *x = 0;    *y = 0;     /* Get the Xor of all elements */    for (i = 1; i < n; i++)        Xor ^= arr[i];     /* Get the rightmost set bit in set_bit_no */    set_bit_no = Xor & ~(Xor - 1);     /* Now divide elements in two sets by    comparing rightmost set bit of Xor with bit    at same position in each element. */    for (i = 0; i < n; i++) {         /*Xor of first set */        if (arr[i] & set_bit_no)            *x = *x ^ arr[i];        /*Xor of second set*/        else {            *y = *y ^ arr[i];        }    }} /* Driver code */int main(){    int arr[] = { 2, 3, 7, 9, 11, 2, 3, 11 };    int n = sizeof(arr) / sizeof(*arr);    int* x = new int[(sizeof(int))];    int* y = new int[(sizeof(int))];    get2NonRepeatingNos(arr, n, x, y);    cout << "The non-repeating elements are " << *x         << " and " << *y;} // This code is contributed by rathbhupendra
// C program for above approach#include <stdio.h>#include <stdlib.h> /* This function sets the values of*x and *y to non-repeating elementsin an array arr[] of size n*/void get2NonRepeatingNos(int arr[], int n, int* x, int* y){    /* Will hold Xor of all elements */    int Xor = arr[0];     /* Will have only single set bit of Xor */    int set_bit_no;    int i;    *x = 0;    *y = 0;     /* Get the Xor of all elements */    for (i = 1; i < n; i++)        Xor ^= arr[i];     /* Get the rightmost set bit in set_bit_no */    set_bit_no = Xor & ~(Xor - 1);     /* Now divide elements in two sets by    comparing rightmost set bit of Xor with bit    at same position in each element. */    for (i = 0; i < n; i++) {         /*Xor of first set */        if (arr[i] & set_bit_no)            *x = *x ^ arr[i];        /*Xor of second set*/        else {            *y = *y ^ arr[i];        }    }} /* Driver program to test above function */int main(){    int arr[] = { 2, 3, 7, 9, 11, 2, 3, 11 };    int* x = (int*)malloc(sizeof(int));    int* y = (int*)malloc(sizeof(int));    get2NonRepeatingNos(arr, 8, x, y);    printf("The non-repeating elements are %d and %d", *x,           *y);    getchar();}
// Java Program for above approach public class UniqueNumbers {     // This function sets the values of    // *x and *y to non-repeating elements    // in an array arr[] of size n    public static void UniqueNumbers2(int[] arr, int n)    {        int sum = 0;        for (int i = 0; i < n; i++) {             // Xor  all the elements of the array            // all the elements occurring twice will            // cancel out each other remaining            // two unique numbers will be xored            sum = (sum ^ arr[i]);        }         // Bitwise & the sum with it's 2's Complement        // Bitwise & will give us the sum containing        // only the rightmost set bit        sum = (sum & -sum);         // sum1 and sum2 will contains 2 unique        // elements initialized with 0 box        // number xored with 0 is number itself        int sum1 = 0;        int sum2 = 0;         // traversing the array again        for (int i = 0; i < arr.length; i++) {             // Bitwise & the arr[i] with the sum            // Two possibilities either result == 0            // or result > 0            if ((arr[i] & sum) > 0) {                 // if result > 0 then arr[i] xored                // with the sum1                sum1 = (sum1 ^ arr[i]);            }            else {                // if result == 0 then arr[i]                // xored with sum2                sum2 = (sum2 ^ arr[i]);            }        }         // print the the two unique numbers        System.out.println("The non-repeating elements are "                           + sum1 + " and " + sum2);    }     public static void main(String[] args)    {        int[] arr = new int[] { 2, 3, 7, 9, 11, 2, 3, 11 };        int n = arr.length;        UniqueNumbers2(arr, n);    }}// This code is contributed by Parshav Nahta
# Python3 program for above approach # This function sets the values of# *x and *y to non-repeating elements# in an array arr[] of size n  def UniqueNumbers2(arr, n):     sums = 0     for i in range(0, n):         # Xor  all the elements of the array        # all the elements occurring twice will        # cancel out each other remaining        # two unique numbers will be xored        sums = (sums ^ arr[i])     # Bitwise & the sum with it's 2's Complement    # Bitwise & will give us the sum containing    # only the rightmost set bit    sums = (sums & -sums)     # sum1 and sum2 will contains 2 unique    # elements  initialized with 0 box    # number xored with 0 is number itself    sum1 = 0    sum2 = 0     # Traversing the array again    for i in range(0, len(arr)):         # Bitwise & the arr[i] with the sum        # Two possibilities either result == 0        # or result > 0        if (arr[i] & sums) > 0:             # If result > 0 then arr[i] xored            # with the sum1            sum1 = (sum1 ^ arr[i])         else:             # If result == 0 then arr[i]            # xored with sum2            sum2 = (sum2 ^ arr[i])     # Print the the two unique numbers    print("The non-repeating elements are ",          sum1, " and ", sum2)  # Driver Codeif __name__ == "__main__":     arr = [2, 3, 7, 9, 11, 2, 3, 11]    n = len(arr)     UniqueNumbers2(arr, n) # This code is contributed by akhilsaini
// C# program for above approachusing System; class GFG {     // This function sets the values of    // *x and *y to non-repeating elements    // in an array arr[] of size n    static void UniqueNumbers2(int[] arr, int n)    {        int sum = 0;        for (int i = 0; i < n; i++) {             // Xor  all the elements of the array            // all the elements occurring twice will            // cancel out each other remaining            // two unique numbers will be xored            sum = (sum ^ arr[i]);        }         // Bitwise & the sum with it's 2's Complement        // Bitwise & will give us the sum containing        // only the rightmost set bit        sum = (sum & -sum);         // sum1 and sum2 will contains 2 unique        // elements  initialized with 0 box        // number xored with 0 is number itself        int sum1 = 0;        int sum2 = 0;         // Traversing the array again        for (int i = 0; i < arr.Length; i++) {             // Bitwise & the arr[i] with the sum            // Two possibilities either result == 0            // or result > 0            if ((arr[i] & sum) > 0) {                 // If result > 0 then arr[i] xored                // with the sum1                sum1 = (sum1 ^ arr[i]);            }            else {                 // If result == 0 then arr[i]                // xored with sum2                sum2 = (sum2 ^ arr[i]);            }        }         // Print the the two unique numbers        Console.WriteLine("The non-repeating "                          + "elements are " + sum1 + " and "                          + sum2);    }     // Driver Code    static public void Main()    {        int[] arr = { 2, 3, 7, 9, 11, 2, 3, 11 };        int n = arr.Length;         UniqueNumbers2(arr, n);    }} // This code is contributed by akhilsaini
<script>    // Javascript program for above approach         // This function sets the values of    // *x and *y to non-repeating elements    // in an array arr[] of size n    function UniqueNumbers2(arr, n)    {        let sum = 0;        for(let i = 0; i < n; i++)        {             // Xor  all the elements of the array            // all the elements occurring twice will            // cancel out each other remaining            // two unique numbers will be xored            sum = (sum ^ arr[i]);        }         // Bitwise & the sum with it's 2's Complement        // Bitwise & will give us the sum containing        // only the rightmost set bit        sum = (sum & -sum);         // sum1 and sum2 will contains 2 unique        // elements initialized with 0 box        // number xored with 0 is number itself        let sum1 = 0;        let sum2 = 0;         // Traversing the array again        for(let i = 0; i < arr.length; i++)        {             // Bitwise & the arr[i] with the sum            // Two possibilities either result == 0            // or result > 0            if ((arr[i] & sum) > 0)            {                 // If result > 0 then arr[i] xored                // with the sum1                sum1 = (sum1 ^ arr[i]);            }            else            {                 // If result == 0 then arr[i]                // xored with sum2                sum2 = (sum2 ^ arr[i]);            }        }         // Print the the two unique numbers        document.write("The non-repeating " +                          "elements are " + sum1 +                          " and " + sum2);    }         let arr = [ 2, 3, 7, 9, 11, 2, 3, 11 ];    let n = arr.length;          UniqueNumbers2(arr, n); // This code is contributed by vaibhavrabadiya117.</script>
The non-repeating elements are 7 and 9
Time Complexity: O(n) Auxiliary Space: O(1)
Please refer below post for detailed explanation : Find the two numbers with odd occurrences in an unsorted array
Method 3(Use Maps)
In this method, we simply count frequency of each element. The elements whose frequency is equal to 1 is the number which is non-repeating. The solution is explained below in the code-
C++
Java
Python3
C#
Javascript
// C++ program for Find the two non-repeating elements in// an array of repeating elements/ Unique Numbers 2 #include <bits/stdc++.h>using namespace std; /* This function prints the two non-repeating elements in an * array of repeating elements*/ void get2NonRepeatingNos(int arr[], int n){    /*Create map and calculate frequency of array       elements.*/     map<int, int> m;    for (int i = 0; i < n; i++) {        m[arr[i]]++;    }     /*Traverse through the map and check if its second      element that is the frequency is 1 or not. If this is      1 than it is the non-repeating element print it.It is      clearly mentioned in problem that all numbers except      two are repeated once. So they will be printed*/     cout << "The non-repeating elements are ";    for (auto& x : m) {        if (x.second == 1) {            cout << x.first << " ";        }    }} /* Driver code */int main(){    int arr[] = { 2, 3, 7, 9, 11, 2, 3, 11 };    int n = sizeof(arr) / sizeof(arr[0]);    get2NonRepeatingNos(arr, n);} // This code is contributed by Abhishek
/*package whatever //do not write package name here */ //Java program to find 2 non repeating elements//in array that has pairs of numbers import java.util.*;import java.io.*; class GFG {         //Method to print the 2 non repeating elements in an array      public static void print2SingleNumbers(int[] nums){                 /*We use a TreeMap to store the elements          in the sorted order*/         TreeMap<Integer, Integer> map = new TreeMap<>();                 int n = nums.length;                 /*Iterate through the array and check if each          element is present or not in the map. If the        element is present, remove it from the array        otherwise add it to the map*/                 for(int i = 0; i<n; i++){            if(map.containsKey(nums[i]))                  map.remove(nums[i]);            else                map.put(nums[i],1);        }                 System.out.println("The non-repeating integers are " + map.firstKey() + " " + map.lastKey());    }      //Driver code    public static void main (String[] args) {        int[] nums = new int[]{2,11,3,11,7,3,9,2};          print2SingleNumbers(nums);    }      //This code is contributed by Satya Anvesh R}
# Python program for Find the two# non-repeating elements in an array# of repeating elements/ Unique Numbers 2 #  This function prints the two non-repeating elements in an#  array of repeating elementsdef get2NonRepeatingNos(arr, n):     # Create map and calculate frequency of array    # elements    m = {}    for i in range(n):        if(arr[i] not in m):            m[arr[i]] = 0         m[arr[i]] = m[arr[i]] + 1     # Traverse through the map and check if its second    #   element that is the frequency is 1 or not. If this is    #   1 than it is the non-repeating element print it.It is    #   clearly mentioned in problem that all numbers except    #   two are repeated once. So they will be printed    print("The non-repeating elements are", end = " ")    for key,value in m.items():        if (value == 1):            print(key,end = " ") # Driver codearr = [ 2, 3, 7, 9, 11, 2, 3, 11 ]n = len(arr)get2NonRepeatingNos(arr, n) # This code is contributed by shinjanpatra
// C# program for the above approachusing System;using System.Collections.Generic;using System.Linq; public class GFG {   // Method to print the 2 non repeating elements in an array  public static void print2SingleNumbers(int[] A)  {     /*We use a TreeMap to store the elements          in the sorted order*/    Dictionary<int, int> map = new Dictionary<int, int>();     int n = A.Length;     /*Iterate through the array and check if each          element is present or not in the map. If the        element is present, remove it from the array        otherwise add it to the map*/    for (int i = 0 ; i < n; i++)    {      if(map.ContainsKey(A[i]))        map.Remove(A[i]);      else        map.Add(A[i], 1);    }    Console.Write("The non-repeating integers are " );     foreach(KeyValuePair<int, int> it in map){      if (it.Value == 1) {        Console.Write(it.Key + " ");      }    }   }   // Driver Code  public static void Main(String[] args) {    int[] nums = new int[]{2, 11, 3, 11, 7, 3, 9, 2};    print2SingleNumbers(nums);  }} // This code is contributed by code_hunt.
<script> // JavaScript program for Find the two non-repeating elements in// an array of repeating elements/ Unique Numbers 2 /* This function prints the two non-repeating elements in an * array of repeating elements*/ function get2NonRepeatingNos(arr, n){    /*Create map and calculate frequency of array       elements.*/     let m = new Map();    for (let i = 0; i < n; i++) {        if(!m.has(arr[i]))        {            m.set(arr[i],0);        }        m.set(arr[i],m.get(arr[i])+1);    }     /*Traverse through the map and check if its second      element that is the frequency is 1 or not. If this is      1 than it is the non-repeating element print it.It is      clearly mentioned in problem that all numbers except      two are repeated once. So they will be printed*/     document.write("The non-repeating elements are ");    for (let [key,value] of m) {        if (value == 1) {            document.write(key," ");        }    }} /* Driver code */ let arr = [ 2, 3, 7, 9, 11, 2, 3, 11 ];let n = arr.length;get2NonRepeatingNos(arr, n);  // This code is contributed by shinjanpatra </script>
The non-repeating elements are 7 9 
Time Complexity: O(nlogn) Auxiliary Space: O(n)
Method 4(Use Sets):
In this method, We check if the element already exists, if it exists we remove it else we add it to the set.
Approach:
Step 1: Take each element and check if it exists in the set or not. If it exists go to step-3. If it doesn’t exist go to step-2.
Step 2: Add the element to the set and go to step-4.
Step 3: Remove the element from the set and go to step-4.
Step 4: Print the elements of the set.
Implementation:
Java
/*package whatever //do not write package name here *///Java program to find 2 non repeating elements//in array that has pairs of numbers import java.util.LinkedHashSet;import java.util.Iterator;import java.io.*; class GFG {         //Method to print the 2 non repeating elements in an array      public static void print2SingleNumbers(int[] nums){                 // Create a Map Set to store the numbers          LinkedHashSet<Integer> set = new LinkedHashSet<>();                 int n = nums.length;                 /*Iterate through the array and check if each          element is present or not in the set. If the        element is present, remove it from the array        otherwise add it to the set*/                 for(int i = 0; i<n; i++){              if(set.contains(nums[i]))                  set.remove(nums[i]);              else                  set.add(nums[i]);        }                     //Iterator is used to traverse through the set          Iterator<Integer> i = set.iterator();                 /*Since there will only be 2 non-repeating elements        we can directly print them*/          System.out.println("The 2 non repeating numbers are : " + i.next() + " " + i.next());    }      //Driver code    public static void main (String[] args) {        int[] nums = new int[]{2, 3, 7, 9, 11, 2, 3, 11 };          print2SingleNumbers(nums);    }      //This code contributed by Satya Anvesh R}
The 2 non repeating numbers are : 7 9
C++
Java
Python3
C#
Javascript
// C++ program for Find the two non-repeating elements in// an array of repeating elements/ Unique Numbers 2 #include <bits/stdc++.h>using namespace std; /* This function prints the two non-repeating elements in an* array of repeating elements*/ void get2NonRepeatingNos(int arr[], int n){    /*Create map and calculate frequency of array    elements.*/     // Create a Map Set to store the numbers    set<int> s;    for (int i = 0; i < n; i++)    {        /*Iterate through the array and check if each        element is present or not in the set. If the        element is present, remove it from the array        otherwise add it to the set*/        if (s.find(arr[i]) != s.end())            s.erase(arr[i]);        else            s.insert(arr[i]);    }    cout << "The 2 non repeating numbers are : ";    for (auto it : s)        cout << it << " ";    cout << endl;} /* Driver code */int main(){    int arr[] = {2, 3, 7, 9, 11, 2, 3, 11};    int n = sizeof(arr) / sizeof(arr[0]);    get2NonRepeatingNos(arr, n);} // This code is contributed by Aditya kumar
// Java code to implement the approachimport java.util.*; class GFG {   /* This function prints the two non-repeating elements in an* array of repeating elements*/   static void get2NonRepeatingNos(int arr[], int n)  {    /*Create map and calculate frequency of array    elements.*/     // Create a Map Set to store the numbers    HashSet<Integer> s = new HashSet<Integer>();    for (int i = 0; i < n; i++)    {      /*Iterate through the array and check if each        element is present or not in the set. If the        element is present, remove it from the array        otherwise add it to the set*/      if (s.contains(arr[i]))        s.remove(arr[i]);      else        s.add(arr[i]);    }    System.out.print("The 2 non repeating numbers are : ");    for (int it : s)      System.out.print(it + " ");    System.out.println();  }   // Driver code  public static void main (String[] args) {     int arr[] = {2, 3, 7, 9, 11, 2, 3, 11};    int n = arr.length;    get2NonRepeatingNos(arr, n);  }} // This code is contributed by sanjoy_62.
# Python program for Find the two non-repeating elements in# an array of repeating elements/ Unique Numbers 2 #  This function prints the two non-repeating elements in an#  array of repeating elementsdef get2NonRepeatingNos(arr, n):     # Create a Set to store the numbers    s = set()    for i in range(n):             # Iterate through the array and check if each        # element is present or not in the set. If the        # element is present, remove it from the array        # otherwise add it to the set         if (arr[i] in s):            s.remove(arr[i])        else:            s.add(arr[i])    print("The 2 non repeating numbers are :",end=" ")    for it in s:        print(it,end=" ")    print() # Driver codearr = [2, 3, 7, 9, 11, 2, 3, 11]n = len(arr)get2NonRepeatingNos(arr, n) # This code is contributed by shinjanpatra
// C# program for the above approachusing System;using System.Collections.Generic; class GFG{   /* This function prints the two non-repeating elements in an* array of repeating elements*/   static void get2NonRepeatingNos(int[] arr, int n)  {    /*Create map and calculate frequency of array    elements.*/     // Create a Map Set to store the numbers\    HashSet<int> s = new HashSet<int>();         for (int i = 0; i < n; i++)    {      /*Iterate through the array and check if each        element is present or not in the set. If the        element is present, remove it from the array        otherwise add it to the set*/      if (s.Contains(arr[i]))        s.Remove(arr[i]);      else        s.Add(arr[i]);    }    Console.Write("The 2 non repeating numbers are : ");    foreach (int it in s)      Console.Write(it + " ");    Console.WriteLine();  } // Driver Codepublic static void Main(String[] args){    int[] arr = {2, 3, 7, 9, 11, 2, 3, 11};    int n = arr.Length;    get2NonRepeatingNos(arr, n);}} // This code is contributed by avijitmondal1998.
<script> // JavaScript program for Find the two non-repeating elements in// an array of repeating elements/ Unique Numbers 2 /* This function prints the two non-repeating elements in an* array of repeating elements*/function get2NonRepeatingNos(arr, n){     // Create a Set to store the numbers    let s = new Set();    for (let i = 0; i < n; i++)    {             /*Iterate through the array and check if each        element is present or not in the set. If the        element is present, remove it from the array        otherwise add it to the set*/        if (s.has(arr[i]))            s.delete(arr[i]);        else            s.add(arr[i]);    }    document.write("The 2 non repeating numbers are : ");    for (const it of s)        document.write(it," ");    document.write("</br>");} /* Driver code */let arr = [2, 3, 7, 9, 11, 2, 3, 11];let n = arr.length;get2NonRepeatingNos(arr, n); // This code is contributed by shinjanpatra </script>
The 2 non repeating numbers are : 7 9 
Time Complexity: O(nlogn)
 Auxiliary Space: O(n)
Akanksha_Rai
rathbhupendra
CubE
parshavnahta97
akhilsaini
vaibhavrabadiya117
adnanirshad158
abhishekcs001
anandakrishnananilkumar
anveshr541
arorakashish0911
adityakumar129
code_hunt
joaquin144
shinjanpatra
surinderdawra388
sanjoy_62
avijitmondal1998
Accolite
Amazon
Bitwise-XOR
FactSet
Google
MakeMyTrip
Microsoft
Qualcomm
Bit Magic
Accolite
Amazon
Microsoft
FactSet
MakeMyTrip
Google
Qualcomm
Bit Magic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Bits manipulation (Important tactics)
Bit Fields in C
Set, Clear and Toggle a given bit of a number in C
C++ bitset and its application
Divide two integers without using multiplication, division and mod operator
1's and 2's complement of a Binary Number
Check whether K-th bit is set or not
Write an Efficient C Program to Reverse Bits of a Number
Count total set bits in all numbers from 1 to n
Find most significant set bit of a number