对于交换两个变量的值,我们通常的操作都是,定义一个变量,借助它实现两个变量的交换:
int a = 1,b = 2;
int c = a;
a = b;
b = c;这算是一种比较基础的实现,但是如果不许定义多余的变量呢?我们还有几种方法,下面详细介绍以下:
(1)"容器"法
题目说不许定义变量,但是我们可以通过定义"容器"来实现交换,我们可以定义栈啊,队列啊类似的东西作为"容器",通过往里面放,往出来取的作法来实现,以栈为例子:
int a = 1,b = 2;
Stack<Integer> stack = new Stack<Integer>();
stack.push(a);
stack.push(b);
a = stack.pop();
b = stack.pop();简单易懂,不多做解释.
(2)坐标法
对于此问题,我们可以转换一种思维方式,把a,b看作两个数轴上的点,而a,b的值则为,a,b点到原点的距离.详细步骤如下:
int a = 1,b = 2;
//把a,b放在数轴上,围绕着a,b两点间的距离来计算问题
a = b - a;//a,b两点间的距离
b = b - a;//b到原点距离减去b到a的距离,则为a到原点的距离,赋值给b
a = b + a;//a到原点的距离加上a,b两点的距离,则为b到原点距离,赋值给a
//交换完毕(3)位运算法
int a = 1,b = 2;
//异或运算:相同位上的二进制数,相同为0,不同为1
a = a ^ b; //0010^0001=0011
b = a ^ b; //0011^0001=0010
a = a ^ b; //0011^0010=0001位运算是利用了位运算中的异或运算的特点,相同位为0,不相同位为1,通过异或运算可以使原数的某些二进制位发生逆转,从而完成了交换算法.
(4)储存地址法
int a = 1,b = 2;
if(a<b)
{
a = b - a;
b = b - a & 0x0000ffff;
a = b + a & 0x0000ffff;
}
else
{
b = a - b;
a = a - b & 0x0000ffff;
b = a + b & 0x0000ffff;
}其实对地址的操作实际上就是对整数进行的运算,假设两个对象a,b,两个对象存储在不同的地址,两者相减得到的整数即两个对象的储存空间相隔了多少个字节,地址和一个整数相加即为a对象后面的整数个a类数据单元的地址.所以可以通过对地址的整数运算来实现两个数的交换.(其实个人觉得和上述的"坐标法"类似,只是没有了负半轴,需要先确定一下哪个大哪个小罢了,一种思想,两种实现).
以上就是"不用第三个变量,交换两个变量的值"的总结!
本文介绍在不使用第三个变量的情况下,如何实现两个变量之间的值交换。包括使用容器法、坐标法、位运算法及储存地址法等四种方法。
222

被折叠的 条评论
为什么被折叠?



