×

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

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.

Difference between Two Sets in C++

The distinction between the two sets is made up of the components that are present in the first set but absent from the second set. The function consistently duplicates the...

3 minutes read.

How is multiset implemented in C++

Similar to sets, multisets are an associative container type where several items may share the same values. Associative containers implement instantly searchable sorted data structures with O(log n) complexity. In a multiset,...

5 minutes read.

CPP Templates

C++ provides a powerful feature called template, which allows the definition of generic classes and generic functions. Generic programming is a technique where different algorithms work in communion by using...

4 minutes read.

How to Reverse a String in C++ using Do-While Loop

Strings In C++, a string is an object that represents a group (or sequence) of various characters. Strings are part of the standard string class in C++ (std::string). The characters of...

4 minutes read.

Binary Operator Overloading in C++

The Binary Operator Overloading in the C++ programming language will be covered in this part. An operator which comprises two operands to execute a mathematical operation is termed the Binary...

6 minutes read.

Program to find the GCD of two numbers in C++

Before understanding the program of GCD or HCF, one must know what GCD or HCF is. What is GCD? The GCD is referred to as Greatest Common Divisor. HCF is the other...

8 minutes read.

C++ Continue in for loop

Continue statement: Inside the loop, the continue statement is used to control the loop. C++ utilizes the continue keyword to implement the continue statement, which transfers the program's flow at the start...

4 minutes read.

Dynamic Constructor in C++

Dynamic constructors create dynamic memory by using a dynamic memory allocator new within the constructor. This allows us to initialize objects dynamically. The term dynamic constructor is used when memory...

2 minutes read.

Do-While Loop Examples in C++

Before we move on the examples of Do-While loop, let’s learn little bit about the Do-While loop in C++ language. Do While loop An iterative loop that checks the condition at the...

5 minutes read.

C++ Installation

Let's install C++ setup to start programming in C++. C++ setup contains C++ compiler which is required in your system. There are lots of C++ compilers available, you must choose...

1 minute read.

C++ Call by Value

In this article, we will discuss C++ Call by Value with their syntax, examples, use cases, advantages, and disadvantages. C++ Function A function is a set of statements that executes a task....

5 minutes read.

Sliding Window Technique in C++

Sliding Window Technique or Window Sliding Technique is a computational technique that is mainly used to reduce the use of nested loop and replace it with a single loop. It...

4 minutes read.

SET Data Structure in C++

Generally, in our home, we store food items in a fridge or kitchen efficiently to find them easily and use them. Similarly, in programming, we need to store the data...

6 minutes read.

Ascending order in C++

In C++, the term "ascending order" refers to a specific order in which a list of elements is arranged. When a list of elements is arranged in ascending order, the...

3 minutes read.

Reverse function in C++

The function std::reverse() is included in the standard template library of C++. It takes in a beginning and ending iterator, reversing the order. To use the reverse statement, we need...

2 minutes read.

Reverse a Number in C++

In this tutorial, you'll learn how to utilize a C++ program to reverse a number entered by a user at runtime. Because there are various ways to write a C++...

3 minutes read.

Factorial of a Number in C++ using while Loop

What is a factorial? The factorial of a number is the product of all the positive numbers less than or equal to n, indicated by n! According to the standard for an...

6 minutes read.

Handling multiple clients on the Server with multithreading using Socket Programming in C or C++

To understand this guide completely, the reader is assumed to be familiar with the foundations of server and client models and socket programming. If one wants to create any scalable...

7 minutes read.

Implementing the sets without C++ STL containers

Many practical features and tools in C++ support us in programming competitions. One of these parts is a set from the Standard Template Library (STL), which offers an effective way...

6 minutes read.