目录
前言
面试题中经常刷到一道题,那就是如何在不创建临时变量的情况下交换两个变量的值,本文便列出两种常见解法,以供参考。
一、普通情况下的交换变量
通常情况下,我们交换变量都会创建一个临时变量tmp,用以存储a的值,然后将b的值赋给a,再将tmp中存储的a的值赋给b。但本题中要求不能存在tmp这种临时变量,故下文提供两种解法。
代码如下:
int main()
{
int a = 1;
int b = 2;
int tmp = a;
a = b;
b = tmp;
printf("%d %d", a, b);
return 0;
}
二、不创建临时变量方法一
在本方法中,我们直接利用两个数与两个数和之间的关系,便可以在不创建临时变量的条件下完成交换,我们首先将a与b的和存储到a中,而后用a中的和减去b得到a再赋给b,再用a中的和减去b中的a得到b赋给a,便完成了交换。但该方法需要注意溢出的问题,当两数都非常的大的时候,他们的和可能会导致a溢出,从而使结果发生变化。
代码如下:
//交换两个变量,不创建临时变量
int main()
{
int a = 1;
int b = 2;
a = a + b;
b = a - b;
a = a - b;
printf("%d %d", a, b);
return 0;
}//要考虑溢出的风险
三、不创建临时变量方法二
在本方法中,我们利用数的二进制序列之间的关系,来完成不创建临时变量的变量交换。假设a=1(0001),b=2(0010)。我们首先将a与b的异或存储到a中,此时a为0011。然后再次用a(0011)与b(0010)异或得到0001存储到b中。再次用a(0011)与b(0001)异或得到0010存储到a中。此时,我们就得到了a(0010)和b(0001),即a=2,b=1。
代码如下:
//方法二
int main()
{
int a = 1;//0001
int b = 2;//0010
a = a ^ b;//0011
b = a ^ b;//0001
a = a ^ b;//0010
printf("%d %d", a, b);
return 0;
}