【java】java 如何不使用第三个变量来交换两个数的值

412 篇文章 483 订阅 ¥19.90 ¥99.00
本文探讨了在Java中不使用第三个变量交换两个数的值的方法,包括算术运算和位运算。算术运算通过加减操作实现,而位运算则利用异或操作达到交换目的。这些技巧在面试和编程实践中颇为有用。
摘要由CSDN通过智能技术生成


在这里插入图片描述

1.概述

今天是一个悲伤的一天,我的悲伤逆流成河。非常非常的悲伤。主要是有这个一个面试题。如何不使用第三个变量来交换两个数的值。

考官说小学生都会的题目,你不会?我他妈还就是没回答上来。

然后百度了一下,如下:

此处转载:如何不使用第三个变量来交换两个数的值

最近在看《c++从入门到精通》自学c++,里面有一道课后题是如何做到不适用第三个变量来交换两个数的值,以下是我在网上查找到的资料,记录下并作为笔记。

题目:a=10,b=15,将a / b的值互换。

通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。代码如下:

  int a,b;
  a=10; b=15;
  int t;
  t=a; a=b; b=t;

这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法)。

上面的算法最大的缺点就是需要借助一个临时变量。那么不借助临时变量可以实现交换吗?答案是肯定的!

2.方案

2.1 算术运算

简单来说,就是通过普通的+和-运算来实现。代码如下:

a=a+b;//a的值变成了a+b的和
b=a-b;//相当于a+b-b,结果就是原来a的值赋值给了b
a=a-b;//相当于a+b-a,结果就是把原来的b的值赋值给了a

通过以上运算,a和b中的值就进行了交换。表面上看起来很简单,但是不容易想到,尤其是在习惯标准算法之后

算术运算二

   @Test
    public void swapData(){
        int a,b;
        a=10;b=12;
        a=b-a; //a=2;b=12
        b=b-a; //a=2;b=10
        a=b+a; //a=12;b=10
        System.out.println(a);
        System.out.println(b);
    }

它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。
在这里插入图片描述

具体过程:

  1. 第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;
  2. 第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;
  3. 第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。

此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)

2.2 位运算

通过异或运算也能实现变量的交换,这也许是最为神奇的,请看以下代码:


	@Test
    public void swapData2() {
        int a=10,b=12; //a=1010^b=1100;
        a=a^b; //a=0110^b=1100;
        b=a^b; //a=0110^b=1010;
        a=a^b; //a=1100=12;b=1010;

        System.out.println(a);
        System.out.println(b);

    }

此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变

即:a^b^b=a。将a=a^b代入b=a^b则得b=a^b^b=a;同理可以得到a=b^a^a=b;轻松完成交换。

以上三个算法均实现了不借助其他变量来完成两个变量值的交换,相比较而言算术算法和位算法计算量相当,地址算法中计算较复杂,却可以很轻松的实现大类型(比如自定义的类或结构)的交换,而前两种只能进行整形数据的交换(理论上重载“^”运算符,也可以实现任意结构的交换)。

这里要求数组的两个要交换的数据内存地址都是不一样的,如果一样,会都变成0

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值