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};
}
};