# Find even occurring elements in an array of limited range

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: Please solve it on “PRACTICE” first, before moving on to the solution.

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

 ` `

## 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 `

Output :

`12 23 15`

This article is contributed by Aditya Goel. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@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

GeeksforGeeks has prepared a complete interview preparation course with premium videos, theory, practice problems, TA support and many more features. Please refer Placement 100 for details

My Personal Notes arrow_drop_up

Article Tags :
Practice Tags :

2

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.