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
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;
}
};