您的位置:首页 > 编程语言 > Java开发

在不借助第三方变量下实现两个数交换

2013-07-25 23:06 253 查看
记得大一时老师提过一次不借助第三方变量实现两个数交换,后来也没太在意,最近偶然看到一个据传是google的笔试题,大意就是在不借助第三方变量情况下实现两个数交换,下面我就用两个整型来说说我的一些看法。

         在我们学习中,两个数交换变量基本是必学的,在借助第三方变量代码如下演示;

                int x = 5;
int y = 10;
int temp = x;
x = y;
y = temp;

在不借助三方变量下,我觉得可能很多人会想到的是如下代码:

int x = 5;
int y = 10;
x = x + y;
y = x - y;
x = x - y;
感觉这个也稍微容易理解,先把两个数之和加起来放到x中,然后用和减去y值自然会得到x的值交换给了y,此时用和再减去交换后的y值自然就可以得到交换后的x值并且赋值给X,这样就能达到交换目的,初看这样的代码感觉也挺强大的,非常聪明绕开了第三方变量,可是后来偶然想到了另一个问题就是对于一个int数来说是有一定范围的,在java中,int型占有四个四节,对于int值最大也只能取到2147483647,当然咯,要计算这个最大值也不用咋门去拿着计算器挨个按数字了,java中给我们封装好了一些数据类型,拿来即可用,对于整型:
Integer  x  =  null;   System.out.println(x.MAX_VALUE);就可以获得了。话说回来,如果咋门取的x值y值本身就很大,这样一加就有可能超出了int的范围,自然就不行咯。网上还有一种类似解法是:

                int x = 5;
int y = 7;
x = y - x;
y = y - x;
x = y + x;

这个理解起来可能就费点劲了,这个利用了一个数学知识,将x和y看成数轴上两个点,第三行的意思是把y到x的距离先保存到x变量中,第四行就是用y的距离减掉x与y的距离就是x到原点的距离咯,然后把值赋给y,最后一行是把交换后y到原点的距离加上x与y的距离自然就是原点到初识值y点的距离了,从而实现交换。不过这个算法依然会产生于上类似超越int范围的问题,如果x定义一个很大的整数,y定义一个很大的负数依然会出现超越范围问题,此时经典算法就来了:

                int x = 5;
int y = 7;
x = x ^ y;     //  x = 5 ^ 7;
y = x ^ y;     //  y = 5 ^ 7 ^ 7;
x = x ^ y;     //  x = 5 ^ 7 ^ 5;

这个就充分利用了异或的特征,对于同一个数,异或另一个数两次还是这个数,对于这个特性以前课设还做过一个简易的加密程序,就是利用了异或这个特点。在这个交换代码中,对于第四行,相当于y = x ^ y ^ y;自然运算后得到了x值,第五行,同理 x = x ^ y ^ y; 这个交互确实非常到位而且非常精彩,我觉得如果在笔试中如果再碰到这样的题果断写上异或语句将会是非常出彩的一笔。或许还有其他更多的好方法,期待你的加入与讨论.....

      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息