×

C++ Program to find the element that occurs once

Write a program to find the element in the array that occurs once. Given that all the numbers in the array are present two times and the array is sorted, find the single occurring element.

For example

Input

arr[] = {10, 10, 20, 30, 30, 40, 40, 50, 50} N = 9

Output

20

Explanation

Among all the elements 20 is occurring once.

Input

arr[] = {1, 1,  2,  5, 5} N = 5

Output

2

Explanation

Among all the elements 2 is occurring once.

Naive approach

As we can see the array given is in sorted manner. Run a loop from begin to end and increment the i by 2. Inside the for loop if arr[i] != arr[i+1], store the arr[i] as ans.

C++ Code

#include <bits/stdc++.h>

using namespace std;




void search_single(int arr[], int n) // function to check the single occurring element

{

    int ans = -1; // initially it is -1

    for (int i = 0; i < n; i += 2) { // run for and increment i by 2

        if (arr[i] != arr[i + 1]) { // check the duplicity

            ans = arr[i]; // update ans if found

            break;

        }

    }




    if (arr[n - 2] != arr[n - 1]) // check if last element is unique or not

            ans = arr[n-1];




    cout << "The single occurring element is " << ans << "\n"; // print ans

}




// Driver code

int main()

{

    int arr[] = { 1, 1, 2, 4, 4, 5, 5, 6, 6 };

    int n = sizeof(arr) / sizeof(arr[0]); // find size of the array




    search_single(arr, n);




    return 0;

}

Output

The single occurring element is 2

C code

#include <stdio.h>




void search_single(int arr[], int n) // function to check the single occuring element

{

    int ans = -1; // initially it is -1

    for (int i = 0; i < n; i += 2) { // run for and increment i by 2

        if (arr[i] != arr[i + 1]) { // check the duplicacy

            ans = arr[i]; // update ans if found

            break;

        }

    }




    if (arr[n - 2] != arr[n - 1]) // check if last element is unique or not

            ans = arr[n-1];




    printf( "The single occurring element is %d",ans); // print ans

}




/

int main()

{

    int arr[] = { 1, 1, 2, 4, 4, 5, 5, 6, 6 };

    int n = sizeof(arr) / sizeof(arr[0]); // find size of the array




    search_single(arr, n);




    return 0;

}

Output

The single occurring element is 2

Time complexity - O(n)

Space complexity - O(1)

Using XOR

To find the singly occurring element, we can use the idea of XOR operation.

a^a = 0 and a^0 = a

It means whenever we will encounter two same elements the output will be 0 and if an element and zero goes under XOR operation the result will be a.

For example

arr[]= {1, 1, 2}

Let ans be the output variable

ans = 1^0= 1

ans = 1^1 = 0

ans = 0^2 = 2

Operations at bit level are extremely fast. So, this operation is faster than the naive approach.

Approach

  • Run a loop from 0 to n.
  • Declare a variable ans.
  • Under the loop run ans = ans ^ arr[i]
  • Print ans

C++ code

#include <bits/stdc++.h>

using namespace std;




void search_single(int arr[], int n) // function to check the single occuring element

{

     int ans = 0;

    for (int i = 0; i < n; i++) {

        ans = ans ^ arr[i];

    }




    cout << "The single occurring element is " << ans << "\n"; // print ans

}







int main()

{

    int arr[] = { 1, 1, 2, 4, 4, 5, 5, 6, 6 };

    int n = sizeof(arr) / sizeof(arr[0]); // find size of the array




    search_single(arr, n);




    return 0;

}

Output

The single occurring element is 2

C code

#include <stdio.h>

void search_single(int arr[], int n) // function to check the single occuring element

{

    int ans = 0;

    for (int i = 0; i < n; i++) {

        ans = ans ^ arr[i];

    }




printf( "The single occurring element is %d",ans); // print ans




}




int main()

{

    int arr[] = { 1, 1, 2, 4, 4, 5, 5, 6, 6 };

    int n = sizeof(arr) / sizeof(arr[0]); // find size of the array




    search_single(arr, n);




    return 0;

}

Output

The single occurring element is 2

TIme complexity - O(n)

Space complexity - O(1)

Efficient approach

The use of binary search makes the solution more optimised.

Approach

All elements before the required have the first occurrence at even index (0, 2, ..) and the next occurrence at odd index (1, 3, ...). And all elements after the required elements have the first occurrence at an odd index and the next occurrence at an even index.

1) Find the middle index, say 'mid'.

2) If 'mid' is even, then compare arr[mid] and arr[mid + 1]. If both are the same, then put required element after 'mid' else before mid.

3) If 'mid' is odd, then compare arr[mid] and arr[mid - 1]. If both are the same, then put the required element after 'mid' and else before mid.

C++ code

#include <iostream>

using namespace std;

void search(int arr[], int low, int high) // binary serach implementation

{

          // Base cases

          if (low > high)

                   return;


          if (low == high) {

                   cout << "The element occuring once is  " << arr[low]; // if the element is found that is occuring once

                   return;

          }


          int mid = (low + high) / 2; // find the mid range




          // If mid is even and element next to mid is

          // same as mid, then output element lies on

          // right side, else on left side

          if (mid % 2 == 0) {

                   if (arr[mid] == arr[mid + 1])

                             search(arr, mid + 2, high);

                   else

                             search(arr, low, mid);

          }

          // If mid is odd

          else {

                   if (arr[mid] == arr[mid - 1])

                             search(arr, mid + 1, high);

                   else

                             search(arr, low, mid - 1);

          }

}


int main()

{

          int arr[] = { 1, 1, 2, 4, 4, 5, 5, 6, 6 };

          int len = sizeof(arr) / sizeof(arr[0]);




          search(arr, 0, len - 1);

          return 0;

}

Output

The element occurring once is 2

C code

#include <stdio.h>

void search(int arr[], int low, int high) // binary search implementation

{

          // Base cases

          if (low > high)

                   return;

          if (low == high) {

                   printf( "The element occurring once is  %d", arr[low]); // if the element is found that is occurring once

                   return;

          }

          int mid = (low + high) / 2; // find the mid range

          // If mid is even and element next to mid is

          // same as mid, then output element lies on

          // right side, else on left side

          if (mid % 2 == 0) {

                   if (arr[mid] == arr[mid + 1])

                             search(arr, mid + 2, high);

                   else

                             search(arr, low, mid);

          }


          // If mid is odd

          else {

                   if (arr[mid] == arr[mid - 1])

                             search(arr, mid + 1, high);

                   else

                             search(arr, low, mid - 1);

          }

}


int main()

{

          int arr[] = { 1, 1, 2, 4, 4, 5, 5, 6, 6 };

          int len = sizeof(arr) / sizeof(arr[0]);




          search(arr, 0, len - 1);




          return 0;

}

Output

The element occurring once is 2

Time complexity - (log n)


Related Topics

C++ Memory Management

Memory management is a method of controlling computer memory and allocating memory space to applications to increase overall system performance. What is the purpose of memory management? Because the array contains homogeneous...

4 minutes read.

Check for Balanced Brackets in an Expression (well-formedness) using Stack

Write a program that check the correctness of the pairs and ordering of the characters “{“, “}”, “(“, “)”, “[“, “]” in the expression string exp. Example: Checking for balanced parenthesis is one of...

2 minutes read.

Loops in C++

A loop statement in most programming languages allows us to execute a statement or a collection of statements numerous times. Control structures of programming languages vary, allowing for more complex...

6 minutes read.

Hexadecimal to Decimal in C++

In computers, hexadecimal numbers are represented with base 16 and decimal numbers are represented with base 10 and values 0-9, whereas hexadecimal numbers have digits ranging from 0 to 15,...

3 minutes read.

C++ String

A string is a collection of characters. C++ programming language supports both C string as well as standard C++ library string. In C++, string is an object of std::string class. C Style String The C style...

5 minutes read.

C++ Queue

C++ queue: Queue in C++ is also a container adapter with the functionality of a queue. Queue is just the opposite of the stack in C++ because stack works on...

4 minutes read.

Queue in C++

What is Queue? As the name suggests, the queue is the type of data structure that follows the FIFO (First In - First Out) mechanism. In simple words, it is...

4 minutes read.

C++ Goto

In this article, we will discuss the C++ goto statement with its syntax, use, key features, key points, pseudo code, and examples. What is the goto statement in C++? In C++, the...

4 minutes read.

Copy constructor

Let's start by learning what a constructor is before diving into the copy constructor in C++. What is a constructor? A constructor is a particular type of class member function that configures the objects of...

7 minutes read.

Program to arrange an array in alternate positive and negative numbers

Let’s say, there is given an array arr, arrange the array in such a way that every positive number is followed by a negative number. If there are extra positive...

4 minutes read.

Pointers in C++

Pointers are a powerful feature in the C++ programming language, allowing developers to directly manipulate memory addresses and create more efficient and dynamic programs. However, pointers can also source various...

3 minutes read.

How to Reverse a String in C++ using For Loop

For Loop: We may loop through a certain section of C++ code repeatedly using the for loop. A for loop is carried out if the test expression yields a true result. The...

4 minutes read.

C++ if-else

C++ if else Control Statement if else control statement in C++ is used to control the program flow in a two-way direction. When condition returns a true value, then the program executes if condition block otherwise...

1 minute read.

Private Inheritance in C++

Private inheritance is an inheritance in object-oriented programming (OOP) languages where a subclass derives from a superclass. Still, the derived class does not inherit the public and protected members of...

7 minutes read.

C++ Namespaces

An Overview In each scope, a name can only represent one entity. As a result, there cannot be two independent variables with the similar names in the same scope, as this may cause...

10 minutes read.

RTTI (Run-Time Type Information) in C++

In C++, RTTI or Run-Time Type Information reveals information about the data type of an object at runtime and only works with classes that have at least one virtual function....

3 minutes read.

Floating Point Operations and Associativity in C, C++ and Java

In this tutorial, we are going to compare Floating-point operations and the concept of associativity. Before we apply the concept of associativity in the floating-point operations in all three programming...

3 minutes read.

C++ Functions

In other programming languages, a function is referred to as a process or a subroutine. We can design functions to execute any task. A function can be used repeatedly. It...

5 minutes read.

Find the Size of Array in C/C++ without using sizeof() function

We know that arrays in C/C++ are the most essential data structures as they have the ability to hold the data in a continuous manner line where the address of...

3 minutes read.

C++ Iterators

What are iterators ? Iterators are among the four foundations of the C++ Standard Template Library, also known as the STL. The memory address of the STL container classes is pointed...

15 minutes read.