java进行两数交换时,如何不用中间量就交换?
比如说要进行两数交换的时候需要设定以个变量temp用它作为中间量倒我像问的是如何不用这个中间量就能给两数调换,请高人指点迷津对,就是用引用型对象来实现请这位仁兄帮忙指点下...
比如说要进行两数交换的时候需要设定以个变量temp 用它作为中间量倒
我像问的是如何不用这个中间量就能给两数调换 ,请高人指点迷津
对,就是用引用型对象来实现 请这位仁兄帮忙指点下 谢谢了 展开
我像问的是如何不用这个中间量就能给两数调换 ,请高人指点迷津
对,就是用引用型对象来实现 请这位仁兄帮忙指点下 谢谢了 展开
11个回答
展开全部
方法有很多,这里举出两种常用的:
方法1:使用^操作来实现
int x = 10;
//用二进制表示:x=0b1010;
int y = 15;
//用二进制表示:x=0b1111;
System.out.println("x="+x+" y="+y);
x = x^y;
//x^y= 0b1010^0b1111 = 0b0101
y = x^y;
//x^y= 0b0101^0b1111 = 0b1010 =10
x = x^y;
//x^y= 0b0101^0b1010 = 0b1111 =15
System.out.println("x="+x+" y="+y);
方法2:使用+,-操作来实现
int x = 10;
int y = 15;
System.out.println("x="+x+" y="+y);
x = x+y;
//x= 10+15=25
y = x-y;
//y= 25-15=10
x = x-y;
//x= 25-10=15
System.out.println("x="+x+" y="+y);
结果:
x=10 y=15
x=15 y=10
早期为了减少中间变量对计算机内存的占用,采用中间的方法来交换数据。其实这种交换并不完美,如果交换的两个数都很大,可能会内存溢出。在现在的开发中建议使用中间值来交换数值。
方法1:使用^操作来实现
int x = 10;
//用二进制表示:x=0b1010;
int y = 15;
//用二进制表示:x=0b1111;
System.out.println("x="+x+" y="+y);
x = x^y;
//x^y= 0b1010^0b1111 = 0b0101
y = x^y;
//x^y= 0b0101^0b1111 = 0b1010 =10
x = x^y;
//x^y= 0b0101^0b1010 = 0b1111 =15
System.out.println("x="+x+" y="+y);
方法2:使用+,-操作来实现
int x = 10;
int y = 15;
System.out.println("x="+x+" y="+y);
x = x+y;
//x= 10+15=25
y = x-y;
//y= 25-15=10
x = x-y;
//x= 25-10=15
System.out.println("x="+x+" y="+y);
结果:
x=10 y=15
x=15 y=10
早期为了减少中间变量对计算机内存的占用,采用中间的方法来交换数据。其实这种交换并不完美,如果交换的两个数都很大,可能会内存溢出。在现在的开发中建议使用中间值来交换数值。
展开全部
先看第一个算法
static class Num{
int a;
int b;
}
public static void swap1(Num num){
num.a = num.a + num.b;
num.b = num.a - num.b;
num.a = num.a - num.b;
}
上面代码通过“+”运算符将a和b的运算结果赋给了a(这时a是中间变量)。然后再计算b,这时a的值已经是(a+b)了,因此,a再减b就是原来的a。 而这时b已经是原来的a了,因此,再用运算后的a(实际上是a+b)减运算后的b(实际上是原来的a),就是原来的b了,最后将这个b赋值给a。
实际上,我们还可以使用“*”、“/”等符号来实现同样的效果,代码如下:
public static void swap2(Num num){
num.a = num.a * num.b;
num.b = num.a / num.b;
num.a = num.a / num.b;
}
public static void swap3(Num num){
num.a = num.a - num.b;
num.b = num.a + num.b;
num.a = num.b - num.a;
}
上面代码在Java中没有什么问题(但使用“/”时,分母和分子不能为0)。就算溢出也会得到正确的结果,但有某些语言中(如C语言),可能会抛出溢出错误,不了避免这种错误。可以加判断,代码如下:
public static void swap4(Num num){
// 不同符号
if (num.a * num.b <= 0)
{
num.a = num.a + num.b;
num.b = num.a - num.b;
num.a = num.a - num.b;
}
else
{
num.a = num.a - num.b;
num.b = num.a + num.b;
num.a = num.b - num.a;
}
}
当然,我们还有更好的方法,就是使用异或运算符,我们知道,任何数与0异或后仍然为它本身,两个相同的数异或后为0。根本这种特性,可以有如下代码:
public static void swap5(Num num){
num.a = num.a ^ num.b;
num.b = num.a ^ num.b;
num.a = num.a ^ num.b;
}
文章出自:http://www.cnblogs.com/nokiaguy/archive/2010/07/28/1787271.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是可以实现的!举一个简单的例子!
int a;int b;
a=a+b;//举例a=10,b=20,那么,现在a=30,b=20
b=a-b;//b=30-20=10
a=a-b;//a=30-10=20
//a=20,b=10.交换成功
不借用第三变量做数据交换的方法有很多,不过我就记住这一种!好像还有个异或运算也能实现!
int a;int b;
a=a+b;//举例a=10,b=20,那么,现在a=30,b=20
b=a-b;//b=30-20=10
a=a-b;//a=30-10=20
//a=20,b=10.交换成功
不借用第三变量做数据交换的方法有很多,不过我就记住这一种!好像还有个异或运算也能实现!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以进行如下操作:
int a;
int b;
a=a+b;//举例a=10,b=20,那么,现在a=30,b=20
b=a-b;//b=30-20=10
a=a-b;//a=30-10=20
//a=20,b=10.交换成功
个人方法,仅供参考!!
int a;
int b;
a=a+b;//举例a=10,b=20,那么,现在a=30,b=20
b=a-b;//b=30-20=10
a=a-b;//a=30-10=20
//a=20,b=10.交换成功
个人方法,仅供参考!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是可以实现的!举一个简单的例子!
int a;int b;
a=a+b;//举例a=10,b=20,那么,现在a=30,b=20
b=a-b;//b=30-20=10
a=a-b;//a=30-10=20
//a=20,b=10.交换成功
不借用第三变量做数据交换的方法有很多,还有异或运算也能实现。
int a;int b;
a=a+b;//举例a=10,b=20,那么,现在a=30,b=20
b=a-b;//b=30-20=10
a=a-b;//a=30-10=20
//a=20,b=10.交换成功
不借用第三变量做数据交换的方法有很多,还有异或运算也能实现。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询