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!