Open In App

Find even occurring elements in an array of limited range

Last Updated : 02 Nov, 2021
Improve
Improve
Like Article
Like
Save
Share
Report

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

 

Recommended Practice

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++




// 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 array
void 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 code
int 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




// Java Program to find the even occurring
// elements in given array
class GFG
{
 
// Function to find the even occurring
// elements in given array
static 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 code
public 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#




// C# Program to find the even occurring
// elements in given array
using System;
 
class GFG
{
 
// Function to find the even occurring
// elements in given array
static 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 code
public 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
// PHP Program to find the even
// occurring elements in given array
 
// Function to find the even
// occurring elements in given array
function 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




# Python 3 program to find the even
# occurring elements in given array
 
# Function to find the even occurring
# elements in given array
def 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 code
arr = [9, 12, 23, 10, 12, 12,
          15, 23, 14, 12, 15 ];
n = len(arr) ;
printRepeatingEven(arr, n);
 
# This code is contributed
# by Shivi_Aggarwal


Javascript




<script>
 
// Javascript Program to find the even occurring
// elements in given array
 
// Function to find the even occurring
// elements in given array
function 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)

 



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads