交换两个数字的值
最近做算法题时突然发现两数交换有好多种方法,所以就整理了一下
本文参考自 数据结构和算法公众号 文章 357,交换两个数字的值
1、使用中间变量
常见的交换数值方法使用一个临时变量进行交换,代码如下:
private void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
2、加法实现
private void swap(int a, int b) {
a = a + b;
b = a - b; // 此时 b = a + b - b = a
a = a - b; // 此时 a = a + b - a = b
}
3、减法实现
private void swap(int a, int b) {
a = a - b;
b = a + b; // 此时 b = a - b + b = a
a = b - a; // 此时 a = a - (a - b) = b
}
4、乘法实现
private void swap(int a, int b) {
a = a * b;
b = a / b; // 此时 b = a * b / b = a
a = a / b; // 此时 a = a * b / a = b
}
乘法和除法都会导致溢出问题,因此不常使用。
5、异或运算
如果a、b两个值不相同,则异或结果为1。. 如果a、b两个值相同,异或结果为0。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:
二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
5 ^ 6 = 3
5 + 6 = 11
95 ^ 5 = 90
95 + 5 = 100
private void swap(int a, int b) {
a ^= b; // 此时 a = a ^ b
b ^= a; // 此时 b = a ^ b ^ b = a ^ 0 = a
a ^= b; // 此时 a = a ^ b ^ a = b ^ 0 = b
}