题目
如何不用额外变量交换两个数
解决方案
方法
function exchange(a, b) {
a = a ^ b;
b = a ^ b;
a = a ^ b;
return { a, b}
}
示例
exchange(5, 7); // { a: 7, b: 5 }
exchange(54, 32); // { a: 32, b: 54 }
解题思路
-
使用异或运算 ^;
-
异或运算(无进位相加,相同为 0,不同为 1),具有如下 3 个特质:
- n ^ 0 = n;
- n ^ n = 0;
- 满足交换律和结合律;
-
交换步骤如下:
// 第一行 a = a ^ b // 第二行 b = a ^ b 等价于 b = (a ^ b) ^ b ,这个时候 b 已经替换成原始的 a // 第三行 a = a ^ b 等价于 a = (a ^ b) ^ a , 现在 a 也替换成原始的 b
-
如果对异或运算还有疑惑和不解,可参考此篇《详解异或运算》;