Número de apariciones de números en la matriz
La pregunta requiere
que, a excepción de dos números en una matriz de números enteros, otros números aparezcan dos veces. Escriba un programa para encontrar estos dos números que solo aparecen una vez. La complejidad temporal requerida es O (n) y la complejidad espacial es O (1).
La idea
se basa en las dos fórmulas a ^ a = 0 y 0 ^ a = a. Primero XOR todos los elementos de la matriz. El resultado binario debe ser el resultado de dos dígitos y se selecciona un bit binario como 1, XOR los elementos totales de la matriz con los bits, el resultado es 1 en un grupo y el resultado es 0 en un grupo, por lo que la clasificación está destinada a dividir dos números separados en dos grupos diferentes, luego XOR los elementos en cada grupo, y los valores restantes en cada grupo son números individuales.
Código
int* singleNumbers(int* nums, int numsSize, int* returnSize)
{
int *res = (int *)malloc(sizeof(int)* 2);
*returnSize = 2;
if (numsSize == 2)
{
return nums;
}
int s = 0;
for (int i = 0; i < numsSize; i++)
{
s ^= nums[i];
}
//n 是计数这两个数哪一位不同
int n = 0;
while ((s & 1) == 0)
{
s = s >> 1;
n++;
}
int s1 = 0;
int s2 = 0;
for (int i = 0; i < numsSize; i++)
{
if ((nums[i] >> n) & 1)
{
s1 ^= nums[i];
}
else
{
s2 ^= nums[i];
}
}
res[0] = s1;
res[1] = s2;
return res;
}