返回

不借助第三变量交换两个变量值,这些解法别出心裁

前端

在学习编程时,我们就会学习到变量的赋值操作和将一个变量的值赋值给另一个变量的方法。而对于交换两个变量的值,我们通常都有解决方案。但是,如果面试官要求不借助第三个变量来交换两个变量的值,您能想到几种解决方案呢?了解并学习了 JS ES6 的数组解构赋值的童鞋可能会对此轻蔑一笑。

方案一:异或运算

异或运算符 (^) 用于比较两个位的值,如果两个位的值不同,则结果为 1,如果两个位的值相同,则结果为 0。我们可以利用这个特性来交换两个变量的值。具体步骤如下:

  1. 将两个变量的值进行异或运算,得到一个新的值。
  2. 将其中一个变量的值与新值进行异或运算,得到另一个变量的值。
  3. 将另一个变量的值与新值进行异或运算,得到第一个变量的值。

举个例子,假设我们要交换变量 a 和 b 的值,其中 a = 5,b = 7。

a = a ^ b; // a = 5 ^ 7 = 2
b = a ^ b; // b = 2 ^ 7 = 5
a = a ^ b; // a = 2 ^ 5 = 7

现在,a 的值就变成了 7,b 的值就变成了 5,两个变量的值就交换了。

方案二:位运算

位运算符 (<<, >>, |, &, ~) 可以对二进制位进行操作。我们可以利用这些运算符来交换两个变量的值。具体步骤如下:

  1. 将两个变量的值左移一位,得到两个新的值。
  2. 将其中一个变量的值右移一位,得到另一个变量的值。
  3. 将另一个变量的值与 1 进行按位与运算,得到第一个变量的值。

举个例子,假设我们要交换变量 a 和 b 的值,其中 a = 5,b = 7。

a = a << 1; // a = 5 << 1 = 10
b = b >> 1; // b = 7 >> 1 = 3
a = a | b; // a = 10 | 3 = 11
b = a & 1; // b = 11 & 1 = 1
a = a >> 1; // a = 11 >> 1 = 5

现在,a 的值就变成了 5,b 的值就变成了 7,两个变量的值就交换了。

方案三:数组解构赋值

数组解构赋值是 ES6 中的新特性,它允许我们将数组中的元素直接赋值给变量。我们可以利用这个特性来交换两个变量的值。具体步骤如下:

  1. 将两个变量的值放入一个数组中。
  2. 使用数组解构赋值将数组中的元素赋值给两个变量。

举个例子,假设我们要交换变量 a 和 b 的值,其中 a = 5,b = 7。

let arr = [a, b];
[a, b] = arr;

现在,a 的值就变成了 7,b 的值就变成了 5,两个变量的值就交换了。

总结

以上是三种不借助第三变量交换两个变量值的方法。这些方法各有优缺点,您可以根据自己的需要选择使用哪种方法。