1.布隆过滤器(k个哈希函数)
2.交换
class Swap {
public:
vector<int> getSwap(vector<int> num) {
num[0]=num[0]^num[1];
num[1]=num[0]^num[1];
num[0]=num[0]^num[1];
return num;
}
};
3.比较
方法一
class Compare {
public:
int flip(int n)
{
return n^1;
}
int sign(int n)
{
return flip((n>>31)&1);
}
int getMax(int a, int b) {
int c=a-b;
int as=sign(a);//as==1表a非负;as==0表a为负;
int bs=sign(b);//bs==1表b非负;bs==0表b为负;
int cs=sign(c);//a-b的符号;
int difab=as^bs;//表示a和b的符号是否相同,不相同为1,相同为0;
int sameab=flip(difab);//表示a和b的符号是否相同,不相同为0,相同为1;
//不相同时difab==1,sameab==0,as起作用,相同时difab==0,sameab==1,cs才起作用
int returnA=difab*as+sameab*cs;
int returnB=flip(returnA);//对returnA取反,给下一步输出a或b用;
return a*returnA+b*returnB;
}
};
方法二
方法二简单直观但是没有考虑到溢出的情况
class Compare {
public:
int flip(int n)
{
return n^1;
}
int sign(int n)
{
return flip((n>>31)&1);
}
int getMax(int a, int b) {
int c=a-b;
int cs=sign(c);//a-b的符号;
int cs1=flip(cs);
return a*cs+b*cs1;
}
};
4.寻找偶数中的奇数
class OddAppearance {
public:
int findOdd(vector<int> A, int n) {
int eo=0;
for(int i=0;i<n;++i)
{
eo=eo^A[i];
}
return eo;
}
};
5.寻找偶数中出现的两个奇数
class OddAppearance {
public:
vector<int> findOdds(vector<int> arr, int n) {
int eo=0;
for(int i=0;i<n;++i)
eo^=arr[i];
int flag=0;
for(int i=0;i<32;++i)
{
flag=1<<i;
if((eo&flag)!=0)
break;
}
vector<int> res(2,0);
for(int i=0;i<n;++i)
{
if((arr[i]&flag)==flag) //与第k为1的数进行异或
res[0]=res[0]^arr[i];
}
res[1]=eo^res[0];
sort(res.begin(),res.end());
return res;
}
};
6.加密与解密