不利用临时变量,交换两个变量的值

Posted 做一个有追求的人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不利用临时变量,交换两个变量的值相关的知识,希望对你有一定的参考价值。

1.借助中间量交换

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

int x = 10; 
int y = 20; 
int temp = x; 
x = y; 
y = temp; 

这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法)。
上面的算法最大的缺点就是需要借助一个临时变量。那么不借助临时变量可以实现交换吗?答案是肯定的!

2.数值相加减交换

int a = 10;
int 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”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。
此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)
缺点:是只能用于数字类型,字符串之类的就不可以了。a+b有可能溢出(超出int的范围),溢出是相对的, +了溢出了,-回来不就好了,所以溢出不溢出没关系,就是不安全。

3.位移运算交换

int a = 10;
int 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;

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

4.利用语法特性交换

int a = 10;
int b = 12;
a = b + 0 * ( b = a);//a=12;b=10

此方法精简,一行代码搞定,但是这种写法是不推荐的,不同的编译器,可能会出现不同的结果。

5.对于字符\串类型的交换

String s1 = "111";
String s2 = "222";
s1 = s1 + "," + s2;
s2 = s1;
s1 = s1.split(",")[1];//s1="222"
s2 = s2.split(",")[0];//s2="111"

 不解释。

以上是关于不利用临时变量,交换两个变量的值的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript不借助第三个变量交换a,b两个变量值

不借助第三个变量交换两个数值类型变量的值

Java千问:Java位运算经典应用

不借助第三个变量实现两个变量交换及原理分析

交换两个数值型变量的值,不使用中间变量

0091 交换两个变量的值( 实现思路:使用一个 临时变量 用来做中间存储 )