不适用额外空间交换两个数
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原本的值。