两个变量交换的四种方法(Java)
对于两种变量的交换,我发现四种方法,下面我用Java来演示一下。
1.利用第三个变量交换数值,简单的方法。
(代码演示一下)
1 class TestEV 2 //创建一个类 3 { 4 public static void main(String[]args) 5 { 6 int x =5,y=10; //定义两个变量 7 8 int temp = x; //定义第三临时变量temp并提取x值 9 x = y; //把y的值赋给x 10 y = temp; //然后把临时变量temp值赋给y 11 12 System.out.println("x="+x+"y="+y); 13 14 } 15 16 } 17
2.可以用两个数求和然后相减的方式进行数据交换,弊端在于如果 x 和 y 的数值过大的话,超出 int 的值会损失精度。
(代码演示一下)
1 class TestEV 2 //创建一个类 3 { 4 public static void main(String[]args) 5 { 6 int x =5,y=10; //定义两个变量 7 8 x = x + y; //x(15) = 5 + 10; 9 y = x - y; //y(5) = x(15) - 10; 10 x = x - y; //x(10) = x(15) - y(5) 11 System.out.println("x="+x+"y="+y); 12 13 } 14 15 }
3.利用位运算的方式进行数据的交换,利用的思想原理是:一个数异或同一个数两次,结果还是那个数,而且不会超出int范围
(代码演示一下)
1 class TestEV 2 //创建一个类 3 { 4 public static void main(String[]args) 5 { 6 int x =5,y=10; //定义两个变量 7 8 x = x^y; 9 y = x^y; //y=(x^y)^y 10 x = x^y; //x=(x^y)^x 11 System.out.println("x="+x+"y="+y); 12 13 } 14 15 }
4.最为简单的,在打印输出的时候直接交换变量
(代码演示一下)
1 class TestEV 2 //创建一个类 3 { 4 public static void main(String[]args) 5 { 6 int x =5,y=10; //定义两个变量 7 8 System.out.println("x="+y+"y="+x); //直接在输出的时候交换 9 10 } 11 12 }
前言
这篇文章总结了七种办法来交换a和b的变量值
1
2
|
var a = 123;
var b = 456;
|
交换变量值方案一
最最最简单的办法就是使用一个临时变量了,不过使用临时变量的方法实在是太low了
1
2
3
4
|
var t;
t = a; a = b; b = t; |
首先把a的值存储到临时变量中,然后b赋值给a,最后拿出临时变量中的a值赋给b,这个办法是最基本的了
交换变量值方案二
下面的方案都不会有临时变量,我总结了一下,其实不使用临时变量的思路都是让其中一个变量变成一个a和b都有关系的值,这样可以先改变另一个变量值, 最后改变原修改的变量值
比如这个
1
2
3
|
a += b; b = a - b; a -= b; |
让a先变成a与b的‘和'(也可以换成a和b的差,一样的) ,‘和'减去b巧妙的得到了a的变量值赋予b ,再通过‘和'减去a的值得到了b的值赋予a,或者是下面的变式(差的形式)
1
2
3
|
a -= b; b = a + b; a = b - a; |
但是感觉和的形式更容易理解
交换变量值方案三
这种方法对于第一次学习JavaScript的同学来说可能不了解,因为我们JavaScript很少会用到位操作,这是我在以前看算法竞赛书的时候学来的,通过底层位运算来进行交换变量值,也是上面的方案演化来的
1
2
3
|
a ^= b; b ^= a; a ^= b; |
了解一下吧,C++甚至可以a^=b^=a^=b
来完成任务,但我发现JavaScript不可以
不过我们可以这样
1
|
a = (b^=a^=b)^a; |
交换变量值方案四
把a先变成了一个对象,这个对象保存着应该交换后的键值对,最后赋值搞定
1
2
3
|
a = {a:b,b:a}; b = a.b; a = a.a; |
交换变量值方案五
和上面的方法很像,只不过对象换成了数组
1
2
3
|
a = [a,b]; b = a[0]; a = a[1]; |
交换变量值方案六
这个办法十分的巧妙,不是我想出来的,想出来的人一定是大神,除非他是托梦想出来的,简单粗暴一行代码交换了a和b的变量值
1
|
a = [b,b=a][0]; |
根据运算符优先级,首先执行b=a
,此时的b直接得到了a的变量值,然后一步数组索引让a得到了b的值(简直不能再厉害)
交换变量值方案七
最后我的方案是利用了ES6的解构赋值语法,它允许我们提取数组和对象的值,对变量进行赋值,不过我现在测试用的chrome浏览器已经实现了
1
|
[a,b] = [b,a]; |
可以看到解构赋值语法让我们的交换变量值变得超级简单,这个解构赋值语法要是讲的话要讲很多不是今天的重点,以后会在再总结现在就不讲了
总结
本文提到了这么多交换变量值的方法,不知道还有没有其他办法,虽然它是一个无关紧要的问题,不过可以练一练我们的脑洞。希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。