Encuentra dos números que faltan | Conjunto 2 (solución basada en XOR)

Dada una array de n enteros únicos donde cada elemento de la array está en el rango [1, n]. La array tiene todos los elementos distintos y el tamaño de una array es (n-2). Por lo tanto, faltan dos números del rango en esta array. Encuentra los dos números que faltan.
Ejemplos: 
 

Input  : arr[] = {1, 3, 5, 6}, n = 6
Output : 2 4

Input : arr[] = {1, 2, 4}, n = 5
Output : 3 5

Input : arr[] = {1, 2}, n = 4
Output : 3 4

Encuentra dos números que faltan | Conjunto 1 (una solución de tiempo lineal interesante)
Hemos discutido dos métodos para resolver este problema en el artículo anterior. El método 1 requiere O(n) espacio extra y el método 2 puede causar desbordamiento. En esta publicación, se discute una nueva solución. La solución discutida aquí es O(n) tiempo, O(1) espacio extra y no causa desbordamiento.
A continuación se muestran los pasos. 
 

  1. Encuentre XOR de todos los elementos de la array y los números naturales del 1 al n. Sea la array arr[] = {1, 3, 5, 6}
       XOR = (1 ^ 3  ^ 5 ^ 6) ^ (1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6)
  2. Según la propiedad de XOR, los mismos elementos se cancelarán y nos quedará 2 XOR 4 = 6 (110). Pero no sabemos los números exactos, sean X e Y.
  3. Un bit se establece en xor solo si los bits correspondientes en X e Y son diferentes. Este es el paso crucial para entender.
  4. Tomamos un bit establecido en XOR. Consideremos el bit establecido más a la derecha en XOR, set_bit_no = 010
  5. Ahora, de nuevo, si aplicamos XOR a todos los elementos de arr[] y de 1 a n que tienen el conjunto de bits más a la derecha, obtendremos uno de los números repetidos, digamos x.
    Ex: Elements in arr[] with bit set: {3, 6}
    Elements from 1 to n with bit set {2, 3, 6}
    Result of XOR'ing all these is x = 2.
  6. De manera similar, si aplicamos XOR a todos los elementos de arr[] y de 1 a n que no tienen establecido el bit más a la derecha, obtendremos el otro elemento, digamos y.
    Ex: Elements in arr[] with bit not set: {1, 5}
    Elements from 1 to n with bit not set {1, 4, 5}
    Result of XOR'ing all these is y = 4 

A continuación se muestra la implementación de los pasos anteriores. 
 

C++

// C++ Program to find 2 Missing Numbers using O(1)
// extra space and no overflow.
#include<bits/stdc++.h>
  
// Function to find two missing numbers in range
// [1, n]. This function assumes that size of array
// is n-2 and all array elements are distinct
void findTwoMissingNumbers(int arr[], int n)
{
    /* Get the XOR of all elements in arr[] and
       {1, 2 .. n} */
    int XOR = arr[0];
    for (int i = 1; i < n-2; i++)
        XOR ^= arr[i];
    for (int i = 1; i <= n; i++)
        XOR ^= i;
  
    // Now XOR has XOR of two missing elements. Any set
    // bit in it must be set in one missing and unset in
    // other missing number
  
    // Get a set bit of XOR (We get the rightmost set bit)
    int set_bit_no = XOR & ~(XOR-1);
  
    // Now divide elements in two sets by comparing rightmost
    // set bit of XOR with bit at same position in each element.
    int x = 0, y = 0; // Initialize missing numbers
    for (int i = 0; i < n-2; i++)
    {
        if (arr[i] & set_bit_no)
            x = x ^ arr[i]; /*XOR of first set in arr[] */
        else
            y = y ^ arr[i]; /*XOR of second set in arr[] */
    }
    for (int i = 1; i <= n; i++)
    {
        if (i & set_bit_no)
            x = x ^ i; /* XOR of first set in arr[] and
                         {1, 2, ...n }*/
        else
            y = y ^ i; /* XOR of second set in arr[] and
                         {1, 2, ...n } */
    }
  
    printf("Two Missing Numbers are\n %d %d", x, y);
}
  
// Driver program to test above function
int main()
{
    int arr[] = {1, 3, 5, 6};
  
    // Range of numbers is 2 plus size of array
    int n = 2 + sizeof(arr)/sizeof(arr[0]);
  
    findTwoMissingNumbers(arr, n);
  
    return 0;
}

Java

// Java Program to find 2 Missing Numbers 
import java.util.*;
  
class GFG {
      
    // Function to find two missing numbers in range
    // [1, n]. This function assumes that size of array
    // is n-2 and all array elements are distinct
    static void findTwoMissingNumbers(int arr[], int n)
    {
        /* Get the XOR of all elements in arr[] and
           {1, 2 .. n} */
        int XOR = arr[0];
        for (int i = 1; i < n-2; i++)
            XOR ^= arr[i];
        for (int i = 1; i <= n; i++)
            XOR ^= i;
       
        // Now XOR has XOR of two missing elements.
        // Any set bit in it must be set in one missing
        // and unset in other missing number
       
        // Get a set bit of XOR (We get the rightmost
        // set bit)
        int set_bit_no = XOR & ~(XOR-1);
       
        // Now divide elements in two sets by comparing
        // rightmost set bit of XOR with bit at same 
        // position in each element.
        int x = 0, y = 0; // Initialize missing numbers
        for (int i = 0; i < n-2; i++)
        {
            if ((arr[i] & set_bit_no) > 0)
                  
                /*XOR of first set in arr[] */
                x = x ^ arr[i]; 
            else
                /*XOR of second set in arr[] */
                y = y ^ arr[i]; 
        }
          
        for (int i = 1; i <= n; i++)
        {
            if ((i & set_bit_no)>0)
              
                /* XOR of first set in arr[] and
                   {1, 2, ...n }*/
                x = x ^ i; 
            else
                /* XOR of second set in arr[] and
                    {1, 2, ...n } */
                y = y ^ i; 
        }
       
        System.out.println("Two Missing Numbers are ");
        System.out.println( x + " " + y);
    }
      
    /* Driver program to test above function */
    public static void main(String[] args) 
    {
         int arr[] = {1, 3, 5, 6};
           
         // Range of numbers is 2 plus size of array
         int n = 2 +arr.length;
           
         findTwoMissingNumbers(arr, n);
      
        }
    }
  
// This code is contributed by Arnav Kr. Mandal.    

Python3

# Python Program to find 2 Missing
# Numbers using O(1)
# extra space and no overflow.
  
# Function to find two missing
# numbers in range
# [1, n]. This function assumes
# that size of array
# is n-2 and all array elements
# are distinct
def findTwoMissingNumbers(arr, n):
  
        # Get the XOR of all
        # elements in arr[] and
    # {1, 2 .. n} 
    XOR = arr[0]
    for i in range(1,n-2):
        XOR ^= arr[i]
    for i in range(1,n+1):
        XOR ^= i
  
    # Now XOR has XOR of two
        # missing elements. Any set
    # bit in it must be set in
        # one missing and unset in
    # other missing number
  
    # Get a set bit of XOR 
        # (We get the rightmost set bit)
    set_bit_no = XOR & ~(XOR-1)
  
    # Now divide elements in two sets
        # by comparing rightmost
    # set bit of XOR with bit at same
        # position in each element.
    x = 0
          
        # Initialize missing numbers
    y = 0 
    for i in range(0,n-2):
        if arr[i] & set_bit_no:
                  
                # XOR of first set in arr[] 
            x = x ^ arr[i]  
        else:
                  
                # XOR of second set in arr[] 
            y = y ^ arr[i]  
    for i in range(1,n+1):
        if i & set_bit_no:
  
                # XOR of first set in arr[] and
                # {1, 2, ...n }
            x = x ^ i 
                        
        else:
  
                # XOR of second set in arr[] and
                # {1, 2, ...n } 
            y = y ^ i
                      
  
    print ("Two Missing Numbers are\n%d %d"%(x,y))
  
# Driver program to test
# above function
arr = [1, 3, 5, 6]
  
# Range of numbers is 2
# plus size of array
n = 2 + len(arr)
findTwoMissingNumbers(arr, n)
  
# This code is contributed
# by Shreyanshi Arun.

C#

// Program to find 2 Missing Numbers
using System;
  
class GFG {
  
    // Function to find two missing
    // numbers in range [1, n].This
    // function assumes that size of
    // array is n-2 and all array
    // elements are distinct
    static void findTwoMissingNumbers(int[] arr, int n)
    {
        // Get the XOR of all elements
        // in arr[] and {1, 2 .. n}
        int XOR = arr[0];
  
        for (int i = 1; i < n - 2; i++)
            XOR ^= arr[i];
  
        for (int i = 1; i <= n; i++)
            XOR ^= i;
  
        // Now XOR has XOR of two missing
        // element. Any set bit in it must
        // be set in one missing and unset
        // in other missing number
        // Get a set bit of XOR (We get the
        // rightmost set bit)
        int set_bit_no = XOR & ~(XOR - 1);
          
        // Now divide elements in two sets
        // by comparing rightmost set bit
        // of XOR with bit at same position
        // in each element.
        int x = 0, y = 0;
  
        // Initialize missing numbers
        for (int i = 0; i < n - 2; i++) {
  
            if ((arr[i] & set_bit_no) > 0)
  
                // XOR of first set in arr[]
                x = x ^ arr[i];
  
            else
                // XOR of second set in arr[]
                y = y ^ arr[i];
        }
  
        for (int i = 1; i <= n; i++) {
            if ((i & set_bit_no) > 0)
                // XOR of first set in arr[]
                // and {1, 2, ...n }
                x = x ^ i;
  
            else
                // XOR of second set in arr[]
                // and {1, 2, ...n }
                y = y ^ i;
        }
  
        Console.WriteLine("Two Missing Numbers are ");
        Console.WriteLine(x + " " + y);
    }
  
    // Driver program
    public static void Main()
    {
        int[] arr = { 1, 3, 5, 6 };
  
        // Range of numbers is 2 plus
        // size of array
        int n = 2 + arr.Length;
  
        findTwoMissingNumbers(arr, n);
    }
}
  
// This code is contributed by Anant Agarwal.

PHP

<?php
// PHP Program to find 2 Missing 
// Numbers using O(1) extra
// space and no overflow.
  
// Function to find two
// missing numbers in range
// [1, n]. This function 
// assumes that size of array
// is n-2 and all array 
// elements are distinct
function findTwoMissingNumbers($arr, $n)
{
      
    // Get the XOR of all 
    // elements in arr[] and
    // {1, 2 .. n} 
    $XOR = $arr[0];
    for ($i = 1; $i < $n - 2; $i++)
        $XOR ^= $arr[$i];
    for ($i = 1; $i <= $n; $i++)
        $XOR ^= $i;
  
    // Now XOR has XOR of two
    // missing elements. Any set
    // bit in it must be set in 
    // one missing and unset in
    // other missing number
  
    // Get a set bit of XOR 
    // (We get the rightmost
    // set bit)
    $set_bit_no = $XOR & ~($XOR - 1);
  
    // Now divide elements in two
    // sets by comparing rightmost
    // set bit of XOR with bit at 
    // same position in each element.
      
    $x = 0;
      
    // Initialize missing numbers
    $y = 0; 
    for ($i = 0; $i < $n - 2; $i++)
    {
        if ($arr[$i] & $set_bit_no)
              
            // XOR of first set in arr[] 
            $x = $x ^ $arr[$i]; 
          
        else
          
            // XOR of second set in arr[] 
            $y = $y ^ $arr[$i]; 
    }
    for ($i = 1; $i <= $n; $i++)
    {
        if ($i & $set_bit_no)
          
            // XOR of first set in arr[]
            // and {1, 2, ...n }
            $x = $x ^ $i; 
              
        else
          
            // XOR of second set in arr[]
            // and {1, 2, ...n }
            $y = $y ^ $i; 
    }
  
    echo "Two Missing Numbers are\n", $x;
    echo "\n", $y;
}
  
    // Driver Code
    $arr = array(1, 3, 5, 6);
  
    // Range of numbers is 2
    // plus size of array
    $n = 2 + count($arr);
  
    findTwoMissingNumbers($arr, $n);
  
// This code is contributed by anuj_67.
?>

Javascript

<script>
  
// Javascript Program to find 2 
// Missing Numbers using O(1)
// extra space and no overflow.
  
// Function to find two missing numbers in range
// [1, n]. This function assumes that size of array
// is n-2 and all array elements are distinct
function findTwoMissingNumbers(arr, n)
{
    /* Get the XOR of all elements in arr[] and
       {1, 2 .. n} */
    let XOR = arr[0];
    for (let i = 1; i < n-2; i++)
        XOR ^= arr[i];
    for (let i = 1; i <= n; i++)
        XOR ^= i;
  
    // Now XOR has XOR of two missing
    // elements. Any set
    // bit in it must be set in 
    // one missing and unset in
    // other missing number
  
    // Get a set bit of XOR 
    // (We get the rightmost set bit)
    let set_bit_no = XOR & ~(XOR-1);
  
    // Now divide elements in two 
    // sets by comparing rightmost
    // set bit of XOR with bit at same
    // position in each element.
    let x = 0, y = 0; // Initialize missing numbers
    for (let i = 0; i < n-2; i++)
    {
        if (arr[i] & set_bit_no)
            x = x ^ arr[i]; /*XOR of first set in arr[] */
        else
            y = y ^ arr[i]; /*XOR of second set in arr[] */
    }
    for (let i = 1; i <= n; i++)
    {
        if (i & set_bit_no)
            x = x ^ i; /* XOR of first set in arr[] and
                         {1, 2, ...n }*/
        else
            y = y ^ i; /* XOR of second set in arr[] and
                         {1, 2, ...n } */
    }
  
    document.write(`Two Missing Numbers are<br> ${x} ${y}`);
}
  
// Driver program to test above function
    let arr = [1, 3, 5, 6];
  
    // Range of numbers is 2 plus size of array
    n = 2 + arr.length;
  
    findTwoMissingNumbers(arr, n);
  
</script>

Producción:  

Two Missing Numbers are
2 4

Complejidad de tiempo: O(n) 
Espacio auxiliar: O(1) 
Sin desbordamiento de enteros
Este artículo es una contribución de Shivam Agrawal . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a contribuir@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *