Espada se refiere a la ligereza de ofrecer 56 preguntas y la cantidad de números en la gama de entendimientos diferentes o más profundos (hay 2 números diferentes)

Espada se refiere a la ligereza de ofrecer 56 preguntas y la cantidad de números en la gama de entendimientos diferentes o más profundos (hay 2 números diferentes)

Predecesor

También se trata del número de apariciones del número en la matriz, pero solo hay un número diferente. Hay muchas soluciones para este problema, puede crear dos matrices o usar punteros y otros métodos para hacerlo, pero el tiempo La complejidad de estos métodos no es ideal. En este momento, es necesario jugar el papel de exclusivo o. Para este operador de bit, el primer uso es cuando se intercambian dos números (es necesario no usar la tercera variable y asegurarse de que está dentro del alcance de int). Después de este método, llame al segundo directamente. Para este problema, XOR ha vuelto a jugar su efecto mágico.

#include<stdio.h>
int main()
{
    
    
   int a = 2;
   int b = 3;
   a = a^b;
   b = a^b;
   a = a^b;
   printf("%d%d", a, b);    //此时只需3次异或,就可以交换两个数,而且不用借助第3个变量,同时也可以保证在int的范围内
}  

Para el antecesor de este problema, también podemos usar la operación XOR. XOR todos los elementos del arreglo para encontrar el número diferente, pero hay una premisa importante en este momento, es decir, esos números repetidos deben repetir números pares Times, porque solo si se repite un número par de veces y luego se aplica XOR con ese número diferente, el resultado puede ser ese número diferente.
Aquí hay un número inverso

#include<stdio.h>
int main()
{
    
    
	int a[4] = {
    
     1, 1, 1, 4 };
	printf("%d", a[0] ^ a[1] ^ a[2] ^ a[3]);
}

Inserte la descripción de la imagen aquí

En este punto, nos encontraremos con que el resultado no es el que queremos, porque el número repetido no se repite veces pares, sino impares.

En este momento, cuando miremos la pregunta 56 de la oferta de Sword Finger, encontraremos un detalle. En los ejemplos que da, todos los números repetidos aparecen veces pares. Esto no es una coincidencia, sino inevitable.

Cuando comprenda el predecesor de este problema, no es difícil pensar si podemos resolver este problema con la ayuda de la solución del predecesor, pero cuando XOR todos los elementos de la matriz, encontraremos que no es lo que queremos. Sí, esta es la dificultad de esta pregunta. Aquí es donde tenemos que aprender la analogía. ¿Podemos pensar en una manera de separar estos dos números diferentes, y luego XOR, no solo convertir este problema en ¿Tuvimos el problema antes?

Código de implementación

#define RESULT_LEN 2
int* singleNumbers(int* nums, int numsSize, int* returnSize)
{
    
    
       int *ret = (int *)malloc(RESULT_LEN * sizeof(int));
       memset(ret, 0, RESULT_LEN * sizeof(int));
       int s=0;
       int i=0;
       for(i=0;i<numsSize;i++)
       {
    
    
          s^=nums[i];
       }
       int k=1;
       while(k<=s)
       {
    
    
           if((s&k)!=0)
           {
    
    
               break;
           }
           k<<=1;
       }
       for(i=0;i<numsSize;i++)
       {
    
    
           if((nums[i]&k)==0)
           {
    
    
              ret[0]^=nums[i];
           }
       }
       ret[1]=s^ret[0];
       *returnSize=RESULT_LEN;
       return ret; 
}

Una breve discusión sobre cada parte del código.

     for(i=0;i<numsSize;i++)  
       {
    
    
          s^=nums[i];
       }

XORing todos los elementos de la matriz es equivalente a XORing dos números diferentes, porque esos mismos números solo aparecen un número par de veces. Este paso es principalmente para encontrar un estándar distintivo para prepararse para la siguiente división, porque para separar los dos números diferentes, debe haber un estándar para separarlos
.

     int k=1;        
       while(k<=s)
       {
    
    
           if((s&k)!=0)
           {
    
    
               break;
           }
           k<<=1;
       }

En este momento, el resultado obtenido se somete a una operación AND, el propósito es encontrar el primer dígito que es 1, y usar este bit como criterio para distinguir para dividir el arreglo en dos. Y esto puede asegurar que dos números diferentes estén separados por separado. El propósito de encontrar que el primer dígito es 1 es agrupar los números cuyos dígitos correspondientes son 1 en un grupo, y agrupar los números que no son 1 en un grupo.
3 .

 for(i=0;i<numsSize;i++)  
       {
    
    
           if((nums[i]&k)==0)
           {
    
    
              ret[0]^=nums[i];
           }
       }

En este momento, se ha convertido en el antecesor de este problema, y ​​luego podemos obtener el número que estamos buscando haciendo XOR por separado. Aquí no hice XOR todos los números con 1 en la posición correspondiente, porque solo necesitamos encontrar un número diferente., Podemos usar la propiedad de exclusivo-o para encontrar el número diferente restante, siempre que el número que encontramos sea XOR con el resultado del XOR inicial de dos dígitos una vez más, se puede obtener el número restante. El código es el siguiente.

ret[1]=s^ret[0]; 

En cuanto a o exclusivo, existen las siguientes propiedades
: Ley conmutativa: A ^ B = B ^ A;
ley asociativa: A ^ (B ^ C) = (A ^ B) ^ C;
ley de identidad: X ^ 0 = X;
return a cero Ley: X ^ X = 0;
Reflexivo: A ^ B ^ B = A ^ 0 = A;
Para cualquier X: X ^ (-1) = ~ X;
si A ^ B = C se cumple, entonces A ^ B = C, B ^ C = A

Resumen (en realidad nos conocimos hace mucho tiempo)

De hecho, en la operación exclusiva de quirófano, en retrospectiva, la mayoría de nosotros tuvimos contacto en la escuela secundaria. En matemáticas, la operación OR exclusiva se escribe como ⊕. Tiene las siguientes propiedades

  1. a ⊕ a = 0
  2. a ⊕ b = b ⊕ a
  3. a ⊕b ⊕ c = a ⊕ (segundo ⊕ c) = (a ⊕ b) ⊕ c;
  4. d = a ⊕ b ⊕ c, podemos deducir a = d ⊕ b ⊕ c.
  5. a ⊕ segundo ⊕ a = segundo.

Este símbolo⊕ De hecho, tuvimos algún contacto con las matemáticas en la escuela secundaria. Siempre hay algunos problemas de datos, es decir, problemas de definición encontrarán este símbolo. Esto también es una buena prueba, de hecho, el conocimiento de la escuela secundaria están preparando el terreno para la universidad, y un cierto conocimiento de la universidad va a surgir en la escuela secundaria en el tema, tal vez esta es una cuestión de aquellos que ponen fuerte.
Por Para esta pregunta, también tengo una comprensión más profunda de XOR. Al principio, mi comprensión se basaba en su uso. El mismo bit es 0 y el bit diferente es 1. Más tarde, cuando cambio dos números, tengo algunos De hecho, XOR es la suma y resta en el sistema binario. Ahora tengo una comprensión más profunda de la misma. Comprendo sus muchas propiedades. Puede usarse como un estándar para distinguir.
Creo que a medida que aprenda más profundamente, tendré una comprensión más profunda de XOR. Hasta ahora, es decir, tener una comprensión superficial de la oferta de Jianzhi 56 y algo de ligereza de XOR.

Supongo que te gusta

Origin blog.csdn.net/IamGreeHand/article/details/115280663
Recomendado
Clasificación