引子
交换两个数的值,a = 10, b = 20;
这个很简单,大家都会,即新定义一个变量做中间量,然后交换,如下:
int a = 10, b = 20;
int temp = a;
a = b;
b = temp;
那么,问题来了,如何在不定义中间变量,即空间复杂度为1的情况下交换两个数的值呢?
^的第一个妙用
首先解释一下^,即异或,在二进制中,两个数的对应位置的值相同则结果为0,不同为1.举个小例子: 3 ^ 4,即011 ^ 100,用数学是表示为
结果为7.同理,3^3的结果为0.
注意:
1. 异或满足交换律,结合律的数学规律
2. 任何一个数异或0结果为它自身.
想必大家已经明白^的用法了,那么如何用它来交换两个数的值呢,我们分三步走:
第一步: 替换a的值
第二步:将a的值给b
第三步:将b的值给a
代码如下:
a = a ^ b; //此时a的值为a^b用来暂存a和b的值
b = a ^ b; //即 b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a; 此时b的值为a
a = a ^ b; //即 a = (a ^ b) ^ a = a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b; 此时a的值为b,交换完毕
^的第二个妙用
LeetCode第136题:只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
分析: 题干中说元素要么出现一次要么出现两次,配合我们上面的内容是否很容易想到解题方法.相同两数的异或为0,0与任何数异或的结果为他自身.
代码如下:
public int singleNumber(int[] nums) {
int a = 0;
for(int i : nums)
a ^= i;
return a;
}
我想只要理解了^的本质,上面的代码还是很好理解的!
如果还有更多关于异或的妙用,可以告诉我,谢谢大家.