【面试题】不通过第三个变量,交换两个int的值
如何不使用第三个变量,交换两个int的值?
曾经面试时被问到这样一个问题:「如何不使用第三个变量,交换两个int的值」。当时很惭愧没有答上来,所以在后来有了答案之后在此记录下来。
答案
这里先上答案:3次异或
public static void main(String[] args) {
// x,y两个初始变量
int x = (int) (10 * (Math.random() + 1));
int y = (int) (10 * (Math.random() + 1));
System.out.println("x: " + x);
System.out.println("y: " + y);
// 交换
x = x ^ y;
y = x ^ y;
x = x ^ y;
System.out.println("x: " + x);
System.out.println("y: " + y);
}
异或的特性
- 归零率:相同数值异或为0
- 恒等率:任何数与0异或为这个数本身
- 交换律:a 异或 b = b 异或 a
- 结合律:a 异或 b 异或 c = (a 异或 b) 异或 c = a 异或 (b 异或 c)
- 自反:a 异或 b 异或 a = b
- 相同为0,不同为1
题解
这里借助异或的结合律、归零率和恒等率
第一次异或:
x = x ^ y;
可以看做是:x1 = x ^ y;
第二次异或:
y = x ^ y;
可以看做是:y = x1 ^ y = x ^ y ^ y = x;
此时现在的y的值为初始状态的x的值
第三次异或:
x = x ^ y;
可以看做是:x = x1 ^ y = x1 ^ x = x ^ y ^ x = y;
此时,x的值为初始状态y的值,交换完成。
通过三次异或,实现不借助第三个变量交换两个int的值。