http://oj.leetcode.com/problems/single-number-ii/
#include "stdio.h"
#include <algorithm>
#include <iostream>
using namespace std;
// Took more than two hours
// Bit operation is not trival
// Record the number of 1 at each position
// 1. Using an array of 32 integer is trival
// 2. Noticing that cnt%=3 is enough to get the result,
// so we just need two bits at each position
// 3. Using three variables to record the cnt of the
// position can make the code clear
class Solution {
public:
// method 2
int singleNumber(int A[], int n) {
// high low bit
// x x 0 => x x
// 0 0 1 => 0 1
// 0 1 1 => 1 0
// 1 0 1 => 0 0
// 1 1 is invalid
int low=0, high=0;
for(int i=0;i<n;i++){
for(int pos=0;pos<32;pos++){
int bitPos=1<<pos;
if((A[i]&bitPos)!=0){// This is very important because the result may be negative
int highValue=(high>>pos)&1, lowValue=(low>>pos)&1;
if(highValue==0&&lowValue==0)
low|=bitPos;
else if(highValue==0&&lowValue==1) {
low&=~bitPos;// set 1 to 0 at a given pos
high|=bitPos;// set 0 to 1 at a given pos
}
else
high&=~bitPos;
}
}
}
return low;
}
// method 3
int singleNumber2(int A[], int n) {
int one=0, two=0, zero=~0;
for(int i=0;i<n;i++){
int tmpZero=zero, tmpOne=one, tmpTwo=two;
one=(one&(~A[i]))|(tmpZero&A[i]);
two=(two&(~A[i]))|(tmpOne&A[i]);
zero=(zero&(~A[i]))|(tmpTwo&A[i]);
}
return one;
}
};
int main(){
Solution s;
int A[]={-2,-2,1,1,-3,1,-3,-3,-4,-2};
cout<<s.singleNumber(A, 10)<<endl;
cout<<s.singleNumber2(A, 10)<<endl;
}