利用异或运算摆脱额外变量完成数据交换
一、性质
1、a、b均为常数
a^b 相同为0,不同为1
2、a、b均为二进制
a=10110,b=00111
a∧b=10001
3、其他性质
0∧N=N
N∧N=0
a∧b=b∧a
a∧(b∧c) = (a∧b)∧c
二、交换功能
void swap(int arr[],int i,int j)
{
arr[i]=arr[i]^arr[j];
arr[j]=arr[i]^arr[j];
arr[i]=arr[i]^arr[j];
} //***前提为i!=j,否则arr[i]=arr[j]=0***
三、Qs
1)int arr[],一种数出现奇数次,其余均偶数次,找出单独出现的数,时间复杂度O(N),空间复杂度O(1)
int num=0;
for(int i=0;arr[i]!='\0';i++)
{
num^=arr[i];
} //结果即为num
2)int arr[],两种数出现奇数次,其余均偶数次,找出单独出现的数,时间复杂度O(N),空间复杂度O(1)
int num1=0,num2=0;
for(int i=0;arr[i]!='\0';i++)
{
num1^=arr[i];
} //num1=a^b
int rightOne=num1&(~num1+1);
//提取出num1最右边的1
//num=1010111100
//~num=0101000011
//~num+1=0101000100
//num1&(~num1+1)=0000000100
for(int i=0;arr[i]!='\0';i++)
{
if((arr[i]&rightOne)==1)
num2^=arr[i];
} //结果即为num1和num1^num2