Find even occurring elements in an array of limited range - GeeksforGeeks

02 Nov, 2021
Given an array that contains odd number of occurrences for all numbers except for a few elements which are present even number of times. Find the elements which have even occurrences in the array in O(n) time complexity and O(1) extra space. Assume array contain elements in the range 0 to 63. Examples :  
Input: [9, 12, 23, 10, 12, 12, 15, 23, 14, 12, 15]
Output: 12, 23 and 15

Input: [1, 4, 7, 5, 9, 7, 3, 4, 6, 8, 3, 0, 3]
Output: 4 and 7

Input: [4, 4, 10, 10, 4, 4, 4, 4, 10, 10]
Output: 4 and 10
 
A simple method would be to traverse the array and store frequencies of its elements in a map. Later, print elements that have even count in the map. The solution takes O(n) time but requires extra space for storing frequencies. Below is an interesting method to solve this problem using bitwise operators.This method assumes that long long integers are stored using 64 bits. The idea is to use XOR operator. We know that  
1 XOR 1 = 0
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0
Consider below input –  
 1, 4, 7, 5, 9, 7, 3, 4, 6, 8, 3, 0, 3 
If we left-shift 1 by value of each element of the array and take XOR of all the items, we will get below binary integer –  
1101101011
Each 1 in the i’th index from the right represents odd occurrence of element i. And each 0 in the i’th index from the right represents even or non-occurrence of element i in the array.0 is present in 2nd, 4th and 7th position in above binary number. But 2 is not present in our array. So our answer is 4 and 7.Below is the implementation of above idea 
C++
Java
C#
PHP
Python 3
Javascript
// C++ Program to find the even occurring elements// in given array#include <iostream>using namespace std; // Function to find the even occurring elements// in given arrayvoid printRepeatingEven(int arr[], int n){    long long _xor = 0L;    long long pos;     // do for each element of array    for( int i = 0; i < n; ++i)    {        // left-shift 1 by value of current element        pos = 1 << arr[i];         // Toggle the bit everytime element gets repeated        _xor ^= pos;    }     // Traverse array again and use _xor to find even    // occurring elements    for (int i = 0; i < n; ++i)    {        // left-shift 1 by value of current element        pos = 1 << arr[i];         // Each 0 in _xor represents an even occurrence        if (!(pos & _xor))        {            // print the even occurring numbers            cout << arr[i] << " ";             // set bit as 1 to avoid printing duplicates            _xor ^= pos;        }    }} // Driver codeint main(){    int arr[] = { 9, 12, 23, 10, 12, 12, 15, 23,                 14, 12, 15 };    int n = sizeof(arr) / sizeof(arr[0]);     printRepeatingEven(arr, n);     return 0;}
// Java Program to find the even occurring// elements in given arrayclass GFG{ // Function to find the even occurring// elements in given arraystatic void printRepeatingEven(int arr[],                               int n){    long _xor = 0L;    long pos;     // do for each element of array    for (int i = 0; i < n; ++i)    {        // left-shift 1 by value of        // current element        pos = 1 << arr[i];         // Toggle the bit everytime        // element gets repeated        _xor ^= pos;    }     // Traverse array again and use _xor    // to find even occurring elements    for (int i = 0; i < n; ++i)    {        // left-shift 1 by value of        // current element        pos = 1 << arr[i];         // Each 0 in _xor represents        // an even occurrence        if (!((pos & _xor)!=0))        {            // print the even occurring numbers            System.out.print(arr[i] + " ");             // set bit as 1 to avoid            // printing duplicates            _xor ^= pos;        }    }} // Driver codepublic static void main(String args[]){    int arr[] = {9, 12, 23, 10, 12, 12,                 15, 23, 14, 12, 15};    int n = arr.length;     printRepeatingEven(arr, n);}} // This code is contributed// by 29AjayKumar
// C# Program to find the even occurring// elements in given arrayusing System; class GFG{ // Function to find the even occurring// elements in given arraystatic void printRepeatingEven(int[] arr,                               int n){    long _xor = 0L;    long pos;     // do for each element of array    for (int i = 0; i < n; ++i)    {        // left-shift 1 by value of        // current element        pos = 1 << arr[i];         // Toggle the bit everytime        // element gets repeated        _xor ^= pos;    }     // Traverse array again and use _xor    // to find even occurring elements    for (int i = 0; i < n; ++i)    {        // left-shift 1 by value of        // current element        pos = 1 << arr[i];         // Each 0 in _xor represents        // an even occurrence        if (!((pos & _xor) != 0))        {            // print the even occurring numbers            Console.Write(arr[i] + " ");             // set bit as 1 to avoid            // printing duplicates            _xor ^= pos;        }    }} // Driver codepublic static void Main(){    int[] arr = {9, 12, 23, 10, 12, 12,                15, 23, 14, 12, 15};    int n = arr.Length;     printRepeatingEven(arr, n);}} // This code is contributed// by Mukul singh
<?php// PHP Program to find the even// occurring elements in given array // Function to find the even// occurring elements in given arrayfunction printRepeatingEven($arr, $n){    $_xor = 0;    $pos;     // do for each element of array    for( $i = 0; $i < $n; ++$i)    {        // left-shift 1 by value        // of current element        $pos = 1 << $arr[$i];         // Toggle the bit everytime        // element gets repeated        $_xor ^= $pos;    }     // Traverse array again and    // use _xor to find even    // occurring elements    for ($i = 0; $i < $n; ++$i)    {        // left-shift 1 by value        // of current element        $pos = 1 << $arr[$i];         // Each 0 in _xor represents        // an even occurrence        if (!($pos & $_xor))        {            // print the even            // occurring numbers            echo $arr[$i], " ";             // set bit as 1 to avoid            // printing duplicates            $_xor ^= $pos;        }    }} // Driver code$arr = array(9, 12, 23, 10, 12, 12,             15, 23, 14, 12, 15 );$n = sizeof($arr); printRepeatingEven($arr, $n); // This code is contributed by aj_36?>
# Python 3 program to find the even# occurring elements in given array # Function to find the even occurring# elements in given arraydef printRepeatingEven(arr, n):     axor = 0;     # do for each element of array    for i in range(0, n):             # left-shift 1 by value of        # current element        pos = 1 << arr[i];         # Toggle the bit every time        # element gets repeated        axor ^= pos;         # Traverse array again and use _xor    # to find even occurring elements    for i in range(0, n - 1):             # left-shift 1 by value of        # current element        pos = 1 << arr[i];         # Each 0 in _xor represents an        # even occurrence        if (not(pos & axor)):                     # print the even occurring numbers            print(arr[i], end = " ");             # set bit as 1 to avoid printing            # duplicates            axor ^= pos;         # Driver codearr = [9, 12, 23, 10, 12, 12,          15, 23, 14, 12, 15 ];n = len(arr) ;printRepeatingEven(arr, n); # This code is contributed# by Shivi_Aggarwal
<script> // Javascript Program to find the even occurring// elements in given array // Function to find the even occurring// elements in given arrayfunction printRepeatingEven(arr, n){    let _xor = 0;    let pos;       // do for each element of array    for (let i = 0; i < n; ++i)    {        // left-shift 1 by value of        // current element        pos = 1 << arr[i];           // Toggle the bit everytime        // element gets repeated        _xor ^= pos;    }       // Traverse array again and use _xor    // to find even occurring elements    for (let i = 0; i < n; ++i)    {        // left-shift 1 by value of        // current element        pos = 1 << arr[i];           // Each 0 in _xor represents        // an even occurrence        if (!((pos & _xor)!=0))        {            // print the even occurring numbers            document.write(arr[i] + " ");               // set bit as 1 to avoid            // printing duplicates            _xor ^= pos;        }    }} // Driver Code             let arr = [9, 12, 23, 10, 12, 12,                 15, 23, 14, 12, 15];        let n = arr.length;           printRepeatingEven(arr, n);           </script>
Output : 
12 23 15
Time Complexity: O(n)
Auxiliary Space: O(1)
This article is contributed by Aditya Goel. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
jit_t
29AjayKumar
Code_Mech
Shivi_Aggarwal
MichaelAnsolis
shubham_singh
splevel62
subham348
Bitwise-XOR
limited-range-elements
Arrays
Bit Magic
Arrays
Bit Magic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Count pairs with given sum
Chocolate Distribution Problem
Window Sliding Technique
Reversal algorithm for array rotation
Next Greater Element
Bitwise Operators in C/C++
Left Shift and Right Shift Operators in C/C++
Travelling Salesman Problem | Set 1 (Naive and Dynamic Programming)
Count set bits in an integer
How to swap two numbers without using a temporary variable?