ACWING74. A única aparece apenas uma vez na matriz de números (para provar oferta de segurança, máquina de estado, binário)

Em uma matriz em adição a um número aparece apenas uma vez, outras figuras apareceram três vezes.

Encontre o número que aparece apenas uma vez.

Você pode assumir que não deve satisfazer as condições de números.

perguntas:

Se ele requer apenas tempo O (n) e O adicional (1) espaço, como fazê-lo?
Amostra
de entrada: [1,1,1,2,2,2,3,4,4,4]

Saída: 3

Referência: 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 /

Tinha acabado de escrever o número de trabalho elétrico, ele teria de enfrentar um problema projeto de circuito aqui, ah realmente conhecimento estão interligadas. . . .

Idéias:
Solução um: todos os números, as estatísticas do número de bits 1 cada, se o número de molde 13, mais de 1, então este bit é de 1.

Solução dois:
muito inteligente, usando o conhecimento da máquina estatal. Mas esta questão, desde que saiba o desenho do circuito (ou operação de bit) o conhecimento é o suficiente.

Pode utilizar dois números binários: ab, ele é usado para representar o estado de um bit ternário, um representante número do valor da I 3.

Inicializar a = 0, b = 0.
o valor 0: a = 0, b = 0
é 1: a = 1, b = 0
é 2: a = 0, b = 1

Suponhamos que o valor adicionado c, c 0 houver entrada, c é 1 é introduzido

Como listado em uma tabela de verdade
Aqui Insert Picture Descrição
da tabela de verdade pode ser desenhada
New_a = A'B'C '+ AB'C

Para A:
novo _a = B '(AC + A'C') = C & A ^ B '

Para b:
Neste caso, uma transformação ocorreu em um New_a.
Usando o mesmo New_a, b, c,
podem ser obtidos:
B = New_a'bc 'New_a'b'c +
B = novo _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;
    }
};

Simplificação se não escrever diretamente a inicial tabela verdade 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;
    }
};

Publicado 843 artigos originais · ganhou elogios 28 · vê 40000 +

Acho que você gosta

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