背景:下面,我们先来看一道算法面试题,看看能不能找到解题思路。
let a = 2;
let b = 3;
//这里填写代码
console.log(a,b);//3,2
如果,你能在看完题目后,找到解题思路的话,恭喜你又掌握了一道算法面试题,那么接下来的内容可以自行选择是否阅读;如果,没有完整的思路话,不妨和我一起看下相关的解题思路吧。
此题本文提供两种解题方案:1.ES6解构赋值;2.使用异或运算(^)。
如果大家还有更好的方法,可以自行发挥哈。
一、方法一:ES6解构赋值法
1.什么是解构赋值?
概念:通过解构赋值,可以将属性/值从对象/数组中取出,赋值给其他变量。
2. 算法实现
let a = 2;
let b = 3;
//这里填写代码
[a,b] = [b,c]
console.log(a,b);//3,2
二、方法二:异或运算(^)
1.什么是异或运算
概念:异或运算是位运算的一种,符号为:^。将两个数转化为二进制数,如果对应位相同则为0,不相等则为1。容易与同或运算记混,根据异或的特性也叫不进位想加。
异或运算的特质?
1.N^0 = N;
2.N^N = 0;
3.异或运行满足交换律和结合律;
2.算法实现
let a = 2;
let b = 3;
//这里填写代码
a = a ^ b = 0010 ^ 0011 = 0001;
b = a ^ b = 0001 ^ 0011 = 0010;
a = a ^ b = 0001 ^ 0010 = 0011;
console.log(a,b);//3,2
解题思路:
先不要把a看成2,也不要把b看成3。如果前面的N能理解的话,在这里只需要把a看成a,把b看成b。
先看第一行的代码
a = a ^ b;
在看第二行代码
//此时的a = a ^ b
b = a ^ b;
//换言之
//b = a ^ b ^ b;
根据异或的交换律特性,先看b^b的部分,任何数异或自己都等于0。
这时a^0不就等于a了嘛。
再看第三行代码
//此时
//b = a ^ b ^ b;
//a = a ^ b;
a = a ^ b;
//换言之
//a = a ^ b ^ a ^ b ^ b;
根据交换律,可以先看a^a = 0;b^b = 0;
这时a=b^0^0;这句的结果应该不用解释了。
参考博客:【拿下算法】:不借助临时变量,交换两个整数的值 https://www.cnblogs.com/huiwenhua/p/13578821.html
详解异或运算 https://blog.csdn.net/qq_42440234/article/details/109659475