不用第三个变量,交换两个变量的值

本文介绍在不使用第三个变量的情况下,如何实现两个变量之间的值交换。包括使用容器法、坐标法、位运算法及储存地址法等四种方法。

对于交换两个变量的值,我们通常的操作都是,定义一个变量,借助它实现两个变量的交换:

    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类数据单元的地址.所以可以通过对地址的整数运算来实现两个数的交换.(其实个人觉得和上述的"坐标法"类似,只是没有了负半轴,需要先确定一下哪个大哪个小罢了,一种思想,两种实现).

        以上就是"不用第三个变量,交换两个变量的值"的总结!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值