不适用额外空间交换两个数

1、简介

平时交换两个数的代码很简单,只需要借助temp辅助变量,比如:

int a = 5;
int b = 6;
int temp = a;
a = b;
b = temp;

即可完成交换。但是假如在面试中让你不使用额外空间交换两个数呢?

2、方法

2.1 方法一:数学

int a = 5;
int b = 6;
a = a + b; //11
b = a - b; //5
a = a - b; //6

先将两个数之和赋值给a,接着a-b自然就是原本a的值,这时候赋值给b,b就拿到了a原本的值。此时a依然是两个数之和,再将a-b赋值给a,a自然就是原本b的值。

2.2 方法二:异或

int a = 5; //101
int b = 6; //110
a = a ^ b; //011
b = a ^ b; //101——5
a = a ^ b; //110——6

该方法利用了异或运算的以下性质:

  • 相同的两个数异或结果为0
  • 任何数与0异或结果还是其自身
  • 异或运算满***换律和结合律

将a^b的结果赋予a,接着再将a与b异或赋值给b,此时b的值就是a^b^b = a^(b^b) = a,也就是说b拿到了a原本的值。 此时a依然是两数异或的结果,而b是a原本的值,接着进行a^b就等同于a^b^a = b, 于是a就拿到了b原本的值。

全部评论

相关推荐

06-27 18:45
中山大学 Ruby
25届应届毕业生,来广州2个礼拜了,找不到工作,绝望了,太难过了…
应届想染班味:9爷找不到工作只能说明,太摆了或者太挑了。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
能干的三文鱼刷了100道题:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务