交换两数值的三种方法

在leetcode刷344.反转字符串时,看到carl大佬提出了另一种交换两数值的方法,又从网上收罗了一下,发现有个大佬总结的很好。转载文章链接地址(侵权请联系我删除)
为了学习,自己又码了一遍。

对于数值交换通常有以下三种方式

1.中间过渡变量

int temp=a;
a=b;
b=temp;

这种方法是最常用和易于理解的,但是由于会使用过渡变量,所以额外占用O(1)的内存空间。

2.相加寄存

可以将sum=a+b的值暂时寄存到a变量上,由于a=sum-b,所以可以将a值放置到b上,又由于b=sum-a,可以将b值移动至a,实现a,b的交换。

a=a+b;
b=a-b;//b=a-b=a+b-b=a-->b=a
a=a-b;//a=a-b=a+b-a=b-->a=b

通过这种方式可以再不引入新的变量的情况下实现交换,但是当a+b>INT_MAX时,此时会产生正溢出,导致最终结果错误

3.位运算

这一种方法是我之前不曾了解过的,对于位运算之前也没有使用过。

根据异或运算规则有,有a^ a=0,a^ 0=a,为了实现交换,可以推导出a=a^ a^ b,b=b^ b^a。

b=a^b;
a=a^b;
b=a^b;

//等同于
b^=a;
a^=b;
b^=a;

这里还使用了复合运算符,和+=一个意思
具体变化过程,如下表,引自
图片引自
利用异或的运算法则即可实现数值交换(此方法除了减少了中间变量的使用,对于性能提升并无卵用),在leetcode上提交比较了下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值