leetcode
Single Number II
描述
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?
#include<iostream>
using namespace std;
class Solution1
{
public:
int singleNumber(int A[], int n)
{
int one = 0, two = 0, three = ~0;
for (int i = 0; i < n; ++i)
{
/*two |= (one & A[i]);
one ^= A[i];
three = ~(one & two);
one &= three;
two &= three;*/
int f=three;
three=(two&A[i])|(three&~A[i]);
two=((one&A[i])|(two&~A[i]));
one=(f&A[i])|(one&~A[i]);
}
return one;
}
};
class Solution2
{
public:
int singleNumber(int a[],int n,int k,int c) //一个n大小的数组,n-1个元素出现k,
//一个出现c次,求出现c次的那个元素
{
int *count=(int*)malloc(sizeof(int)*k);
for(int i=0;i<k;i++)
count[i]=0;
int t=1;
count[k-1]=~0;
for(int i=0;i<n;i++)
{
t=count[k-1];
for(int j=k-1;j>0;j--)
count[j]=(count[j-1]&a[i])|(count[j]&~a[i]);
count[0]=(t&a[i])|(count[0]&~a[i]);
}
return count[c-1];
}
};
class Solution3
{
public:
int singleNumber(int a[],int n,int k,int l)
{
int count[3]={0};
int t=1;
count[2]=~0;
for(int i=0;i<n;i++)
{
t=count[2];
count[2]=(count[1]&a[i])|(count[2]&~a[i]); //出现3次
count[1]=(count[0]&a[i])|(count[1]&~a[i]); //出现2次
count[0]=(t&a[i])|(count[0]&~a[i]); //出现1次
}
return count[1-1];
}
};
void main()
{
Solution2 solution;
int a[10]={4,5,8,8,8,5,4,5,4,7};
cout<<solution.singleNumber(a,10,3,1)<<endl;
}