ACWING74. La única aparece sólo una vez en la serie de números (para probar la oferta de seguridad, máquina de estados, binario)

En una matriz, además de un número aparece sólo una vez, otras figuras han aparecido tres veces.

Encuentra el número que aparece sólo una vez.

Se puede suponer que debe satisfacer las condiciones de números.

preguntas:

Si sólo requiere tiempo O (n) y O adicional (1) el espacio, cómo hacerlo?
Muestra
de entrada: [1,1,1,2,2,2,3,4,4,4]

Salida: 3

Referencia: https: //leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solution/zhuang-tai-ji-jie-jue- ci-wen-ti-Xiang-jie-shu-zi-d /

Acababa de terminar de escribir el número de trabajos de electricidad, se enfrentaría a un problema de diseño de circuitos aquí, ah realmente el conocimiento están vinculados entre sí. . . .

Ideas:
Solución uno: todos los números, las estadísticas del número de 1 bits cada uno, si el número de molde 13, más de 1, entonces este bit es 1.

Solución dos:
muy inteligente, utilizando el conocimiento de la máquina de estados. Pero esta cuestión, siempre que sepa el diseño del circuito (o operación de bit) el conocimiento es suficiente.

Pueden utilizar dos número binario: ab, se utiliza para representar el estado de un bit ternario, un número representativo del valor de I 3.

Inicialización de a = 0, b = 0.
el valor 0: a = 0, b = 0
es 1: a = 1, b = 0
es 2: a = 0, b = 1

Supongamos que el valor añadido c, c 0 es ninguna entrada, c es 1 es de entrada

Tal como se recoge en una tabla de verdad
Aquí Insertar imagen Descripción
de la tabla de verdad se pueden extraer
New_a = A'B'C '+ AB'C

Para A:
nuevo _a = B '(AC + a'c') = C & A ^ B '

Por b:
En este caso una transformación ha tenido lugar en un New_a.
Usando el mismo New_a, b, c,
se puede obtener:
B = New_a'bc 'New_a'b'c +
B = new _a' (B ^ C)

class Solution {
public:
    int findNumberAppearingOnce(vector<int>& nums) {
        int a = 0,b = 0;
        int n = nums.size();
        for(int i = 0;i < n;i++) {
            a = (a ^ nums[i]) & ~b;
            b = (b ^ nums[i]) & ~a;
        }
        return a;
    }
};

Simplificación si no escribe directamente a la primera tabla de verdad a, b, c

class Solution {
public:
    int findNumberAppearingOnce(vector<int>& nums) {
        int a = 0,b = 0;
        int n = nums.size();
        for(int i = 0;i < n;i++) {
            int x = a;
            a = (x & ~b & ~nums[i]) | (~x & ~b & nums[i]);
            b = (~b & nums[i] & x) | (b & ~nums[i] & ~x);
        }
        return a;
    }
};

Publicados 843 artículos originales · ganado elogios 28 · Vistas a 40000 +

Supongo que te gusta

Origin blog.csdn.net/tomjobs/article/details/105001697
Recomendado
Clasificación