Operación de bits 73. Dos números que aparecen solo una vez en la matriz

tema

Enlace de tema: 73. Dos números que solo aparecen una vez en la matriz

responder

La idea es dividir la pregunta en dos subpreguntas simples: busque un número que aparezca una vez en una matriz.

Necesitamos usar una propiedad de la operación XOR: xxx ^x = 0 x = 0X=0 .
Significado de las preguntas, además de las dos figuras están pidiendoxxx y y y , el resto de los números aparecen dos o más veces, luego el número que obtenemos después de XOR todos los números es elxxdeseadox y y XOR de y .

Dado que x ≠ yx \ neq yX=y , por lo que el resultado no debe ser igual a 0, es decir, debe haber al menos un bit que no sea 0 después de convertirlo a binario.

Encuentre la posición de un bit que no sea 0 y divida la matriz dada en dos matrices: un número con 1 y un número con 0.

xx x y y y debe estar ubicado en una matriz diferente. El mismo número debe estar en la misma matriz.

En este punto, el problema se ha transformado en: un número que solo aparece una vez en la matriz.
XOR una de las matrices y el resultado es xxx y y y .
El otro número correspondiente se puede comparar con elxxanteriorx y y El valor XOR de y es XOR. Quexxx ^xxx ^ y = y y = y y=y.

Código AC

class Solution {
public:
    vector<int> findNumsAppearOnce(vector<int>& nums) {
        int sum = 0;
        for (auto i : nums) sum ^= i;
        int k = 0;
        while (true) {
            if (!(sum & (1 << k))) k++;
            else break;
        }
        int x = 0;
        for (auto i : nums) {
            if ((1<<k) & i) x ^= i;
        }
        return vector<int> {x, x ^ sum};
    }
};

Supongo que te gusta

Origin blog.csdn.net/qq_45934120/article/details/107987099
Recomendado
Clasificación