如何优雅的交换两个变量的数值

前言

今天说一个很常见的算法题,如何交换两个数字的数值。题目如下:

现有两个变量,int a = 1,int b = 3;
如果交换两个变量使得 a = 3,b = 1;
说明: a1表示第一步结束后的a变量,a2表示第二步,依次类推,本篇全文适用

解法

普通常用法

1
2
3
int temp = a;
a = b;
b = temp;

这种方法没什么说的,创建临时变量存储a值,将b值赋值给a变量,再从临时变量中将原a值赋值给b变量。交换完成。

加减法

1
2
3
a = a+b;
b = a-b;
a = a-b;

步骤分析:

  1. a1 = a+b
  2. b2 = a1-b
    b2 = a+b-b
    b2 = a
  3. a3 = a1-b2
    a3 = a+b-a
    a3 = b
    利用两数之和减去其中一个等于另一个。但是这种方法容易越界。

乘除法

1
2
3
a = a*b;
b = a/b;
a = a/b;

原理与加减法一致

异或法

主角来了!!!

1
2
3
a^=b;
b^=a;
a^=b;

解析:
首先要了解异或的算法。

  1. 任意一个变量X与其自身进行异或运算,结果为0,即X^X=0。
  2. 任意一个变量X与0进行异或运算,结果不变,即X^0=X
  3. 异或运算具有可结合性,即abc=(ab)c=a(bc)
  4. 异或运算具有可交换性,即ab=ba
    现在来分析运算步骤:
  5. a^=b
    1. a1 = a^b;
  6. b^=a
    1. b2 = b^a1;
    2. b2 = bab;
    3. b2 = a;(bb等于0且0a等于a)
  7. a^=b
    1. a3 = a1^b2;
    2. a3 = aba;
    3. a3 = b;(aa=0且0b=b)

总结

加减法与乘除法易越界、异或法效率最高。