两个数字交换是常见的题目,下面用三种方法解决一下。
方法一
思路:如何把酱油瓶子和油瓶子里面的液体交换,当然是需要再增加一个容器
- 酱油倒进空瓶子
- 油倒进酱油瓶子
- 酱油再倒进油瓶子
//采用辅助空间的方法
void SwapTmp(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
方法二
思路:利用数学的方法,不引入新的变量
//采用数学方法
void SwapTmp(int a, int b)
{
a = a + b;
b = a - b;
a = a - b;
}
方法三
思路:位运算。利用异或运算。
异或特性:相同为0,不同为1
例:对于 2 与 3
2: 0 0 1 0
3: 0 0 1 1
M=2^3:0 0 0 1
M^2: 0 0 1 1
M^3: 0 0 1 0
所以就可以采取不用辅助空间交换两个数。
//没有采用辅助空间,运用异或计算
void SwapNotTmp(int* a, int* b)
{
*a = (*a) ^ (*b);
*b = (*a) ^ (*b);
*a = (*a) ^ (*b);
}