如何才能不用额外变量交换两个值?

原理

首先我们需要知道异或(^)计算:相同为0,不同为1
所以,进行异或计算的结果相当于是结合了两个值的特征
从中我们也可以知道,如果两个相同的值进行异或的话,则得到的结果为0

实战

编写一个函数,不用临时变量,直接交换numbers = [a, b]中a与b的值。
示例:
输入: numbers = [1,2]
输出: [2,1]
提示:
numbers.length == 2

public int[] swapNumbers(int[] numbers) {
    
    
        numbers[0]=numbers[0]^numbers[1];
        numbers[1]=numbers[0]^numbers[1];
        numbers[0]=numbers[0]^numbers[1];
        return numbers;
    }

解析

我想你们一定很困惑,为什么这样就能交换两个值了?
ok,那我们下面就来分解一下上面的三个步骤

  1. 进行a,b两个值的异或计算,得到两个值不同的地方,即特征值让a等于它。
  2. 让a与b进行异或计算。前面说了,如果两个相同的值进行异或计算,则为0,这是通过异或计算本身的原理得到的结果,也可以自己动手亲自计算一下。所以这计算得到的结果就是原来a的值,因为b已经被消除掉了。让b等于这个值,所以b的值就是原来a的值。
  3. a ^ b ^ b=a
  4. 让 a再与b进行异或计算,此时a的值是原来一开始a^b的结果,而b的值是原来a的值。所以这样进行异或计算,又消去了a的值,得到的结果就是原来b的值。
  5. a ^ b ^ a=b
  6. 这样就完成了两个值的交换。

猜你喜欢

转载自blog.csdn.net/weixin_43589025/article/details/110311094