Sword se refiere a la oferta (C++) -JZ56: dos números que aparecen solo una vez en la matriz (operación de algoritmo de bits)

Autor: Zhai Tianbao Steven
Declaración de derechos de autor: Los derechos de autor pertenecen al autor. Para reimpresión comercial, comuníquese con el autor para obtener autorización. Para reimpresión no comercial, indique la fuente

Descripción del Título:

En una matriz de números enteros, excepto dos números que solo aparecen una vez, todos los demás números aparecen dos veces. Escriba un programa para encontrar estos dos números que aparecen solo una vez.

Rango de datos: longitud de la matriz 2≤n≤1000, tamaño de cada número en la matriz 0<val≤1000000
requisitos: complejidad espacial O(1), complejidad temporal O(n)

Consejo: Ordene en orden no descendente al generar.

Ejemplo:

ingresar:

[1,4,1,6]

valor de retorno:

[4,6]

ilustrar:

Devuelve primero el número menor   

Ideas para resolver problemas:

Esta pregunta examina las operaciones de bits. Dos formas de resolver el problema.

1) Ley de Violencia

       Utilice una tabla hash para registrar la frecuencia de aparición y genere el número con una frecuencia de 1. La complejidad espacial de este método no cumple con los requisitos del título.

2) operación XOR

       La operación XOR significa que dos números son iguales a 0 y diferentes a 1. Porque, excepto que el número que está buscando aparece una vez, otros números aparecen dos veces, por lo que después de aplicar XOR a estos números, de acuerdo con sus características, los números repetidos se compensan y solo se retiene el número que aparece una vez.

       Como 4^1^2^1^2. 4 es 100, 1 es 001, 2 es 010, 4^1 obtiene 101, luego ^2 obtiene 111, luego ^1 obtiene 110 y luego ^2 obtiene 100, lo cual es 4.

       Entonces, si hay dos números que aparecen una vez, el resultado es equivalente al XOR de estos dos números. Por ejemplo, 4^1^2^1^2^3, el resultado final es 111, que es 4^3.

       Este tema requiere la salida de estos dos números, entonces, ¿cómo separar 111? 4 y 3, si un determinado bit no es el mismo, el bit del resultado XOR es 1, definimos t a partir de 001 y operamos t y 111 para encontrar qué bit aparece 1 por primera vez; el extremo derecho de 111 es 1, lo que indica que en la posición 00x los números 4 y 3 son diferentes, recorre nuevamente y clasifica todos los datos según el número de este bit, de modo que se puedan obtener dos grupos, el resultado del grupo con el el número 1 es 3, y el grupo con el número 0 el resultado del grupo es 4.

       Hay que decir que este tema está hecho a medida para esta solución. . . Cada condición coincide perfectamente con emm.

Código de prueba:

1) Ley de Violencia

class Solution {
public:
    // 寻找出现一次的数字
    vector<int> FindNumsAppearOnce(vector<int>& nums) {
        unordered_map<int,int> um;
        vector<int> result;
        // 遍历数组
        int size = int(nums.size());
        for(int i = 0; i < size; ++i){
            um[nums[i]]++;
        }
        // 寻找出现频率为1的数
        for(int i = 0; i < size; ++i){
   
   {
            if(um[nums[i]] == 1){
                result.emplace_back(nums[i]);
            }
        }}
        // 按大小顺序输出
        if(result[0] < result[1]){
            return result;
        }
        else{
            return { result[1], result[0] };
        }
    }
};

2) operación XOR

class Solution {
public:
    // 寻找出现一次的数字
    vector<int> FindNumsAppearOnce(vector<int>& nums) {
        vector<int> result{ 0, 0};
        // 遍历数组进行异或运算
        int temp = 0;
        int size = int(nums.size());
        for(int i = 0; i < size; ++i){
            temp ^= nums[i];
        }
        // 找到两个数不相同的第一位
        int t = 1;
        while((t & temp) == 0){
            t <<= 1;
        }
        // 再次遍历,将t位为1的数归为1组,为0的数归为1组,这样两组的异或运算得到的结果就是两个不重复数
        for(int i = 0; i < size; ++i){
            if((t & nums[i]) == 0){
                result[0] ^= nums[i];
            }
            else{
                result[1] ^= nums[i];
            }
        }
        // 按大小顺序输出
        if(result[0] < result[1]){
            return result;
        }
        else{
            return { result[1], result[0] };
        }
    }
};

Supongo que te gusta

Origin blog.csdn.net/zhaitianbao/article/details/132278174
Recomendado
Clasificación