[Una pregunta por día] 22: Números que aparecen solo una vez (resumen de respuestas a las preguntas)

Descripción del título uno

Dada una matriz entera no vacía, excepto que un elemento aparece solo una vez, cada elemento aparece dos veces. Encuentra el elemento que aparece solo una vez.

Descripción:

Su algoritmo debe tener una complejidad de tiempo lineal. ¿Puedes hacerlo sin usar espacio extra?

Ejemplo 1:

输入: [2,2,1]
输出: 1

Código de problema

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int sum = 0;
        for(auto i : nums){
            sum ^= i;
        }
        return sum;
    }
};

Descripción del tema 2

Dada una matriz entera no vacía, excepto que un elemento aparece solo una vez, todos los demás elementos aparecen tres veces. Encuentra el elemento que aparece solo una vez.

Descripción:

Su algoritmo debe tener una complejidad de tiempo lineal. ¿Puedes hacerlo sin usar espacio extra?

Ejemplo 1:

输入: [2,2,3,2]
输出: 3

Código de problema

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int sz = nums.size();

        int sum = 0;
        
        for(int i = 0; i < 32; ++i){
            int count = 0;
            for(auto j : nums){
                count += j >> i & 1;
            }
            if(count % 3){
                sum += 1 << i;
            }
        }
        
        /*int sum = 0, tmp = 0;
		for (auto &i : nums)
		{
			sum = (sum ^ i) & ~tmp;
			tmp = (tmp ^ i) & ~sum;
		}*/
		
        return sum;
    }
};

Descripción del tema tres

Dado un conjunto de números enteros, hay exactamente dos elementos que aparecen solo una vez, y todos los demás elementos aparecen dos veces. Encuentra los dos elementos que aparecen solo una vez.

Ejemplo:

输入: [1,2,1,3,2,5]
输出: [3,5]

Código de problema

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int sum = 0;
        for(auto i : nums){
            sum ^= i;
        }

        //就是保留sum的最后一个1,并且将其他位变为0(记录其大小)
        int k = sum & (-sum); 

        vector<int> num(2, 0);
        for(auto i : nums){
            if(i & k){
                num[0] ^= i;
            }
            else{
                num[1] ^= i;
            }
        }
        
        return num;
    }
};

Si tiene opiniones diferentes, ¡deje un mensaje para discutir!

152 artículos originales publicados · 45 elogiados · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/AngelDg/article/details/105168911
Recomendado
Clasificación