XOR en operaciones binarias y bit

1. Haga una pregunta: Déle una matriz de enteros. Excepto por un número que aparece solo una vez en esta matriz, otros números solo aparecen dos veces. ¿Cuál es el número que aparece solo una vez?

Requisitos: La complejidad del tiempo es O (n) y la complejidad del espacio es O (1).


La dificultad de este tema es la limitación de la complejidad del espacio.


Solución: dos números aparecen en un número, dos números son iguales y el valor XOR de dos números iguales es 0, por lo que solo necesitamos XOR el número de toda la matriz, podemos obtener el que aparece solo una vez Números


<span style="font-size:18px;">int get_one_num(int num[] , int n)
{
    int first = num[0] , i;
    for(i = 1; i < n; i++)
        first ^= num[i];
    return first;
}</span>


2. Problema dos: ahora, hay dos números en esta matriz que aparecen solo una vez. Encuentre estos dos números, y la complejidad de tiempo y espacio permanecerá sin cambios.


Según la solución al primer problema, también obtenemos un valor al final, pero este valor es el valor XOR de esos dos números (que solo aparecen una vez). No conocemos ninguno de estos dos números, por lo que no podemos obtener estos dos números.


Si dividimos la matriz en dos matrices, cada matriz contiene solo un número que aparece solo una vez, y luego llamamos a la solución del problema 1, podemos obtener el resultado.

La clave es cómo dividimos esta matriz, y la complejidad del espacio es O (1)?

En primer lugar, secuencialmente XOR cada número en la matriz, y el resultado son dos resultados XOR que solo aparecen una vez. Debido a que los dos números deben ser diferentes, el número de resultado definitivamente no es 0, que es Al menos un bit de este reloj digital binario es 1, encontramos la posición del primer bit en el chino digital resultante, y lo registramos como el enésimo bit, dividiremos la matriz en uno por si el enésimo bit es 1. Array


Código


<span style="font-size:18px;">int find_one(int x)
{
    int p = 1;
    while(true)
    {
        if((p^x) < x)  break;
        p <<= 1;
    }
    return p;
}

void get_one_num(int num , int n)
{
    int first = num[0] , i;
    for(i = 1; i < n; i++)
        first ^= num[i];
    int one = find_one(first);

    int x = 0 , y = 0;
    for(i = 0; i < n; i++)
    {
        if((one^num[i]) < num[i])
            x ^= num[i];
        else y ^= num[i];
    }

    cout<<(x<y?x:y)<<" "<<(x>y?x:y)<<endl;
}</span>




190 artículos originales publicados · 19 alabanzas · 200,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/zengchenacmer/article/details/38059317
Recomendado
Clasificación