【算法】不借助临时变量,进行两个整数的交换

背景:下面,我们先来看一道算法面试题,看看能不能找到解题思路。

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

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值