Java数值交换

这是一个很经典的题目,面试考试经常碰到,这种场景一般出现在排序中。

我们知道交换两个数有很多写法,总归分为四种:中间值交换、加减交换、运算交换、异或交换,网上有很多关于它们的说法,很多人有异或交换比中间值交换慢的说法,我表示怀疑,因为初学java时就知道位运算在java虚拟机里运算速度是最快的,所以我打算模仿他们的实验进行验证,实验方式很简单,对同一组数进行一亿次循环交换,看它们执行的总时长。

 
                        int x = 2,y = 3;
			Integer count = 10000*10000;
			long start = System.currentTimeMillis();
			System.out.println("中间值交换法交换"+count+"次:开始时间:"+start);
			int t = 0;
			for(int i=0;i<count;i++){
				t = y;
				y = x;
				x = t;
			}
			long end = System.currentTimeMillis();
			System.out.println("中间值交换法交换"+count+"次:结束时间:"+end);
			System.out.println("中间值交换法交换"+count+"次:消耗时间:"+(end-start));
			start = System.currentTimeMillis();
			System.out.println("异或交换法交换"+count+"次:开始时间:"+start);
			for(int i=0;i<count;i++){
				x = x^y;
				y = x^y;
				x = x^y;
			}
			end = System.currentTimeMillis();
			System.out.println("异或值交换法交换"+count+"次:结束时间:"+end);
			System.out.println("异或值交换法交换"+count+"次:消耗时间:"+(end-start));

结果是一个惊喜,的确,一亿次交换异或交换确实要比中间值交换运行时间长,但是如果是一千万次、一百万次、十万次运算异或运算则要比中间值交换快很多,至于一万次,运算速度太快捕获不到更精确的时间。基本上可以证明异或交换其实是比中间值交换快的。至于为什么会在超大数据的情况下异或运算花费更多时间还需要进一步研究。以下是另外两种交换的写法

加减交换

                        x = x+y;
			y = x-y;
			x = x-y;

这种方式弊端相当明显,两个值比较大的情况可能超出本身类型的最大值。

运算交换

x = y + (y=x)*0;

也有这种写法

x = (x+y) - (y=x);
这种方式用最短的代码完成数值交换,看起来很神奇,其实华而不实。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以给你写一个交换数值java程序。public class ExchangeValues { public static void main(String[] args) { int num1 = 10; int num2 = 20; System.out.println("交换前:num1="+num1+",num2="+num2); int temp = num1; num1 = num2; num2 = temp; System.out.println("交换后:num1="+num1+",num2="+num2); } } ### 回答2: 下面是一个Java程序,可以实现交换两个数的值: ```java public class SwapNumbers { public static void main(String[] args) { // 定义两个变量 int num1 = 10; int num2 = 20; System.out.println("交换前的数值:"); System.out.println("num1 = " + num1); System.out.println("num2 = " + num2); // 交换数值 int temp = num1; num1 = num2; num2 = temp; System.out.println("交换后的数值:"); System.out.println("num1 = " + num1); System.out.println("num2 = " + num2); } } ``` 这个程序首先定义了两个变量`num1`和`num2`,分别赋值为10和20。然后输出交换前的数值。接着使用一个临时变量`temp`来保存`num1`的值,将`num2`的值赋给`num1`,最后将`temp`的值赋给`num2`,实现了两个数值交换操作。最后输出交换后的数值。 以上就是一个简单的Java程序,能够实现交换两个数的值。 ### 回答3: 交换两个数的值是一种常见的编程问题,可以使用一个临时变量来解决。下面是一个Java程序示例: ```java public class SwapValues { public static void main(String[] args) { int a = 5; int b = 10; System.out.println("交换前的值:"); System.out.println("a = " + a); System.out.println("b = " + b); int temp = a; a = b; b = temp; System.out.println("交换后的值:"); System.out.println("a = " + a); System.out.println("b = " + b); } } ``` 在上面的示例中,我们声明了两个变量a和b,并初始化它们的值为5和10。然后,我们使用一个临时变量temp来保存a的值,将b的值赋给a,最后将temp的值赋给b。这样就完成了两个数值交换。 程序输出结果为: ``` 交换前的值: a = 5 b = 10 交换后的值: a = 10 b = 5 ``` 这个程序可以扩展为一个可复用的方法,接收两个参数并返回交换后的值: ```java public class SwapValues { public static void main(String[] args) { int a = 5; int b = 10; System.out.println("交换前的值:"); System.out.println("a = " + a); System.out.println("b = " + b); swap(a, b); System.out.println("交换后的值:"); System.out.println("a = " + a); System.out.println("b = " + b); } public static void swap(int x, int y) { int temp = x; x = y; y = temp; } } ``` 但是请注意,这里的swap方法并不能真正实现交换,因为Java方法内部对参数进行的是值传递,原变量的值不会改变。如果要实现真正的交换,可以使用数组或对象作为参数,通过修改数组或对象的值来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值