算法刷题-异或-如何不用额外变量交换两个数

53 阅读1分钟

如何不用额外变量交换两个数

这个问题如果问怎么交换两个数,那很简单,大家都会

int a ,b ,temp;
temp = a;
a = b ;
b = temp;

但是不用额外变量,这一下子还真不到怎么做?那异或运算就可以做到,是不是很神奇,我们先看实现代码

public class XOR {
    public static void main(String[] args) {
        int a = 10, b = 20;
        System.out.println("original value a:" + a + " b:" + b);

        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
        System.out.println("After change value a:" + a + " b:" + b);
    }
}

你没看错,就是这三行代码,就能做到,给大家看下运行结果

Original value a:10 b:20
After change a:20 b:10

那这个运算的原理是什么呢?我们用上面异或运算的几个性质来解释下:

⚠️注意

使用这种方式交换的前提是,两个变量不能指向同一个内存地址,那样异或之后为结果为0

public class XOR {
    public static void main(String[] args) {
        int[] arr = {1,2,3};
        int i = 0,j = 1;

        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
        System.out.println(arr[i] + "," + arr[j]);

        int m = 0,n = 0;

        arr[m] = arr[m] ^ arr[n];
        arr[n] = arr[m] ^ arr[n];
        arr[m] = arr[m] ^ arr[n];
        System.out.println(arr[m] + "," + arr[n]);
    }
}
2,1
0,0

其他题目合集见文档: www.yuque.com/xizhuangbao… 《算法与数据结构-图解基础》