Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
常规做法是利用数组记录每位上出现1的次数并对3取余,这里道理是一样的,同样是记录出现1的次数,只不过这里是利用3个变量记录。
解法一:加减法计数
class Solution {
public:
int singleNumber(int A[], int n) {
if(A == NULL || n % 3 != 1)return 0;
int one = 0, two = 0, three = 0;
for(int i=0; i < n; ++i){
for(int j=0; j < 32; ++j){
if(A[i] & (1 << j)){
if(one & (1 << j)){
one -= (1 << j);
two += (1 << j);
}else if(two & (1 << j)){
two -= (1 << j);
three += (1 << j);
}else if(three & (1 << j)){
three -= (1 << j);
one += (1 << j);
}else{
one += (1 << j);
}
}
}
}
return one;
}
};
解法二:利用位运算计数
class Solution {
public:
int singleNumber(int A[], int n) {
if(A == NULL || n % 3 != 1)return 0;
int one = 0, two = 0, three = 0;
for(int i=0; i < n; ++i){
three = two & A[i];
one = (~three) & (one ^ A[i]);
two = (~one) & (two ^ A[i]);
}
return one;
}
};