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

  最近在看《c++从入门到精通》自学c++,里面有一道课后题是如何做到不适用第三个变量来交换两个数的值,以下是我在网上查找到的资料,记录下并作为笔记。
&&&&&&题目:a=10,b=15,将a / b的值互换。
&&&&&&通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。代码如下:&&&&&&int a,b;&&&&&&a=10; b=15;&&&&&&&&&&&&t=a; a=b; b=t;&&&&&&这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法)。
&&&&&&上面的算法最大的缺点就是需要借助一个临时变量。那么不借助临时变量可以实现交换吗?答案是肯定的!
&&&&&&1) 算术运算&&&&&&简单来说,就是通过普通的+和-运算来实现。代码如下:&&&&&&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=10;b=10&&&&&&通过以上运算,a和b中的值就进行了交换。表面上看起来很简单,但是不容易想到,尤其是在习惯标准算法之后。&&&&&&它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。&&&&&&具体过程:第一句&a=b-a&求出ab两点的距离,并且将其保存在a中;第二句&b=b-a&求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句&a=b+a&求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。&&&&&&此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)
&&&&&&该算法还可以这样做:
&&&&&&int a,b;
&&&&&&a=10;b=12;
&&&&&&a=a+b=22;
&&&&&&b=a-b=10;
&&&&&&a=a-b=12;
&&&&&&两个减操作一个加操作,执行的先后顺序不一样,其原理也稍微有些区别,但根本原理是一样滴。
&&&&&&3) 位运算&&&&&&通过异或运算也能实现变量的交换,这也许是最为神奇的,请看以下代码:&&&&&&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;&&&&&&此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。&&&&&&即:a^b^b=a。将a=a^b代入b=a^b则得b=a^b^b=a;同理可以得到a=b^a^a=b;轻松完成交换。
&&&&&&以上三个算法均实现了不借助其他变量来完成两个变量值的交换,相比较而言算术算法和位算法计算量相当,地址算法中计算较复杂,却可以很轻松的实现大类型(比如自定义的类或结构)的交换,而前两种只能进行整形数据的交换(理论上重载&^&运算符,也可以实现任意结构的交换)。
阅读(...) 评论()java中交换两个数,不出现第三个变量,求完整程序_百度知道下次自动登录
现在的位置:
& 综合 & 正文
不引入第三个变量实现两个数的交换 两种方法
方法1. 使用 位运算中的异或方法,原理如下:
1)按位与,或,异或是按位运算中的三种运算方法。按位异或的运算结果是:
1^1=0;1^0=1;0^0=0;即自己和自己得出的结果是全 0,而0和任何数异或得到的结果是这个数本身,
所以,如果按照下面三个步骤:
y=x^y;// 在这里 y得到的是x的值,因为x^y^y=x^0=x;
x=x^y;//这里 x得到的是y的值,因为 x^y^x=0^y=y;
这里需要注意的是异或满足乘法运算规律。
方法2: 就只是使用平常的加减运算,希望你看的明白:
但是第二种方法不推荐,虽然更容易明白,原因是 两个数相加会出现“数据溢出”的漏洞,所以在数比较小的情况下可以得到正确结果。
&&&&推荐文章:
【上篇】【下篇】实现一个函数,在不使用第三个变量下,把两个参数的值对调
[问题点数:0分]
实现一个函数,在不使用第三个变量下,把两个参数的值对调
[问题点数:0分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。[Java,JS] - 不使用第三个变量完成两个整数的交换
来源:博客园
来源:
 
不使用第三个变量完成两个整数的交换,这个面试题大概大家都碰到过。如:
Java代码

public class Person {public static void main(String[] args) {//利用加减法
int a = 10, b = 5;
System.out.println("a=" + a + "\nb=" + b);
}}

 
还有另外一种方法,且效率更快:
Java代码

public class Person {public static void main(String[] args) {//利用一个数异或本身等于0和异或运算符合交换率
int a = 10, b = 5;
System.out.println("a=" + a + "\nb=" + b);
}}

 
 
 当然以上两种的算法对应js中也支持,如下:
JS代码

var a = 11,b = 22;a = a +b = a -a = a -console.log(a+'\n'+b)

或
JS代码

var a = 11,b = 22;a = a ^b = a ^a = a ^console.log(a+'\n'+b)

 
 
 
 但如果两个变量是对象类型,java(强类型)貌似无能为力了。js却可以,实现方式还不少,如:
JS代码

var a = {name:'jack'},b = {name:'tom'};a = [a,b];b = a[0];a = a[1];console.log(a.name+'\n'+b.name)

或
JS代码

var a = {name:'jack'},b = {name:'tom'};a = {a:a,b:b};b = a.a;a = a.b;console.log(a.name+'\n'+b.name)

 
 
正是利用js动态类型(弱类型)系统及对象/数组直接量特性。其它强类型则不可以,编译器会提示类型转换错误。
资源:
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动

我要回帖

更多关于 java交换两个变量的值 的文章

 

随机推荐