两个变量交换的四种方法(Java) 七种方法(JS)
两个变量交换的四种方法(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]; |
可以看到解构赋值语法让我们的交换变量值变得超级简单,这个解构赋值语法要是讲的话要讲很多不是今天的重点,以后会在再总结现在就不讲了
总结
本文提到了这么多交换变量值的方法,不知道还有没有其他办法,虽然它是一个无关紧要的问题,不过可以练一练我们的脑洞。希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
两个变量交换的四种方法(Java) 七种方法(JS)的更多相关文章
- 两个变量交换的四种方法(Java)
对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. (代码演示一下) class TestEV //创建一个类 { public static ...
- 两个变量交换数字 不用第三个变量的情况下 int a = 5,b = 6
今天可是涨见识额 记录一下 第一种方法: a=a+bb=a-ba=a-b 第二种: b= a+(a=b)*0 一句话搞定
- c# 交换两个变量
使用临时变量: 有人会问只使用两个变量交换,怎么办? 不实用临时变量: 第一种: a=a+b; b=a-b; a=a-b; 第二种: 异或:相同是0,不同是1 上面是整型的,那么字符串可以直接异或吗? ...
- ansible七种武器和json
ansible七种武器和json • 第一种武器 – ansible 命令,用于执 ...
- Java String.contains()方法(转载)
Java String.contains()方法 Java String.contains()方法用法实例教程, 返回true,当且仅当此字符串包含指定的char值序列 描述 java.lang.St ...
- 比较 Java 静态工厂方法与构造函数
1 什么是静态工厂方法 Java 静态工厂方法是在方法前加上 public static,让这个方法变为公开.静态的方法.该方法返回该类的一个实例,就好像一个工厂生产出一个产品.所以称之为静态工厂方法 ...
- 面试题-JavaScript交换两个变量的方法
在平时的业务开发或者面试过程中,经常会遇到交换两个变量这种问题,于是,个人总结以下几种交换变量的方法: 1.方案一 使用一个临时变量来交换 2.方案二 使用ES6解构赋值语法来交换 3.方案三利用数 ...
- JS变量和变量交换的三种方法
一.what 变量就是用来存储数据的容器 二.how 通过var 关键字定义一个变量 var n1; //定义变量 变量的赋值:通过赋值运算符“=” 给变量赋值. var n2=123; //定义变量 ...
- JavaScript中交换两个变量的值得三种做法(代码实现)
javascript在编程时经常会涉及到如何交换两个变量的值,例如常见的冒泡排序,快速排序等:下面我讲根据自己近期所学总结几种常见的交换两个变量值的方法: 方法一:借助第三方变量交换两个变量的值 va ...
随机推荐
- 判断大小端的方法(java和c++)
首先我们给出大小端的定义: 小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址. 大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址. 将 ...
- 第一章 第一个spring boot程序
环境: jdk:1.8.0_73 maven:3.3.9 spring-boot:1.2.5.RELEASE(在pom.xml中指定了) 注意:关于spring-boot的支持, 最少使用jdk7(j ...
- C语言数字与字符串转换 atoi()函数、itoa()函数、sprintf()函数
在编程中经常需要用到数字与字符串的转换,下面就总结一下. 1.atoi() C/C++标准库函数,用于字符串到整数的转换. 函数原型:int atoi (const char * str); #inc ...
- go语言基础之结构体做函数参数 值传递和地址传递
1.结构体做函数参数值传递 示例: package main //必须有个main包 import "fmt" //定义一个结构体类型 type Student struct { ...
- 曲线平滑-B样条曲线 【转】
版权声明:本文为博主原创文章,未经博主允许不得转载. 3D空间曲线三次B样条平滑示例: struct D_DOT3D //D_DOT3D示例,未完全实现 { double x,y,z; } doubl ...
- Faster\Slower 快慢指针的应用
leetcode很多题目都是利用快慢指针来解决题目,下面具体讲解下快慢指针. 概念: 快指针在每一步走的步长要比慢指针一步走的步长要多.快指针通常的步速是慢指针的2倍.在循环中的指针移动通常为:fas ...
- .Net垃圾收集机制—了解算法与代龄
垃圾收集器在本质上就是负责跟踪所有对象被引用到的地方,关注对象不再被引用的情况,回收相应的内存.在.NET平台中同样如此,有效的提高.NET垃圾回收性能,能够提高程序执行效率. 其实垃圾收集并不是伴随 ...
- 时间插件WdatePicker使用方法
只需要引入js文件即可: <script src="WdatePicker/WdatePicker.js"></script> 自己试了个小实例: < ...
- (转)NGUI类关系图
- Jquery 获取table当前行内容
$("a[name='checkOriginal']").click(function () { var parent = $(this).parent().parent().fi ...