A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱德帅 中级黑马   /  2013-4-25 10:10  /  2674 人查看  /  21 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 朱德帅 于 2013-4-25 22:42 编辑

不通过任何第三方变量,交换int x=10;int y = 9;这两个数的值。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

21 个回复

倒序浏览
额。
说2种方式吧:
第一种:
{
  x = x+y;
y = x - y;
x = x - y;
}
第二种:
{
   x = x ^ y;
  y = x ^ y;
x = x ^ y;
}

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
上面哥们的答案很对,记得上学的时候老师也是这么教的,不过后来我自己想到了一种办法就是
y=x--;
x=y++;
回复 使用道具 举报
本帖最后由 殇_心。 于 2013-4-25 10:46 编辑
harborbest 发表于 2013-4-25 10:37
上面哥们的答案很对,记得上学的时候老师也是这么教的,不过后来我自己想到了一种办法就是
y=x--;
x=y++; ...

哥们。 真是神牛啊!!!!  似乎有点小问题。。。 不过亏你也这么想。。
回复 使用道具 举报
楼上神解

  x = x ^ y;
  y = x ^ y;
x = x ^ y;
这一种还是比较好的速度什么的都很快

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
楼上正解啊。。。
回复 使用道具 举报

这个有点儿不懂 ,哪位好心的讲一下啊
x=1010
y=1001
x=x^y=1000
y=x^y=1000
x=x^y=1000
我怎不会啊,帮帮忙啊
回复 使用道具 举报
楼上的你没明白异或的概念啊,异或就是对应位上不相同结果就是1.
回复 使用道具 举报
楼上的你没明白异或的概念啊,异或就是对应位上不相同结果就是1.
回复 使用道具 举报
^这个位操作符,叫做异或操作符,操作符左右两边相对应的位相同时为1,不相同则为0;
x=1010
y=1001
比如 x^y=1010^1001= 1100
y^y=1
x^x=1
x=x^y
y=x^y=x^(y^y)=x;
x=x^y=x^x^y=y;同上

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
殇_心。 发表于 2013-4-25 10:23
额。
说2种方式吧:
第一种:

这个问题应该交给我的嘛。
回复 使用道具 举报
针对数值类型的:
x=x+y;
y=x-y;
x=x-y;
这种是最给力的。:)

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
第一种方法:
{
    x = x ^ y;
   y = x ^ y;
x = x ^ y;
}
这个方法效率最高哦~
第二种方法:
x=x+y;
y=x-y;
x=x-y;
这个方法不适合大数交换,可能会出错的哦~
第三种方法(当然是借用中间变量):
temp=x;
x=y;
y=temp;
还是借用第三方变量好一些,阅读性强且适合各种同类型间的交换哦!~

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
版主拎包郑重提示:如果楼主问题已经解决那么。在自己发表的帖子下面,点“修改”,
然后把主题的分类标记改成“已解决”。就OK了{:soso_e102:} 方便日后查找!
回复 使用道具 举报
  1. package q_2013_03_23;

  2. public class SwapDemo {

  3.      public static void main(String[] args) {
  4.          
  5. //        两个数交换
  6.          swap5(3,5);
  7.          
  8.      }
  9.      
  10. //    第三方临时变量-temp
  11.      public static void swap1(int a,int b){
  12.          
  13.          System.out.println("a="+a+":"+"b="+b);
  14.          int temp;
  15.          temp = a;
  16.          a = b;
  17.          b = temp;
  18.          System.out.println("a="+a+":"+"b="+b);
  19.      }
  20.      
  21. //    不用第三方临时变量-用加减-多行代码
  22.      public static void swap2(int a,int b){//a=3 b=5
  23.          System.out.println("a="+a+":"+"b="+b);
  24.          a = a + b;// a=a+b=3+5=8, b=b=5
  25.          b = a - b;// b=8-5=3
  26.          a = a - b;// a=8-3=5
  27.          System.out.println("a="+a+":"+"b="+b);
  28.      }
  29.      
  30. //    不用第三方临时变量-用异或-多行代码-效率高
  31.      public static void swap3(int a,int b){//a=3 b=5 a=00000011 b=00000101
  32.          System.out.println("a="+a+":"+"b="+b);
  33.          a = a ^ b;//a = 00000110,b=00000101
  34.          b = a ^ b;//b = 00000011=3, a = 00000110   
  35.          a = a ^ b;//a = 00000101=5
  36.          System.out.println("a="+a+":"+"b="+b);
  37.      }
  38.      
  39. //    用一行代码实现交换,用加减
  40.      public static void swap4(int a,int b){
  41.          System.out.println("a="+a+":"+"b="+b);
  42.          b=a+b-(a=b);//b=3-(a=2)=1 //用一行代码实现交换
  43.          //或者a=b+a-(b=a);
  44.          System.out.println("a="+a+":"+"b="+b);
  45.      }
  46.      
  47. //     用一行代码实现,异或
  48.      public static void swap5(int a,int b){//a=3,b=5
  49.          System.out.println("a="+a+":"+"b="+b);
  50.          a = a^b^(b=a);//a=5,b=3
  51.          System.out.println("a="+a+":"+"b="+b);
  52.          b = b^a^(a=b);
  53.          System.out.println("a="+a+":"+"b="+b);
  54.      }
  55.          
  56. }
复制代码
这是我总结的两个数交换的几种方式。
回复 使用道具 举报
用^这个吧,异或的方式,里面只有1和0,1代表真,0代表假,只有1^1才为真,其他的全为假
x = x ^ y;
y = x ^ y;
x = x ^ y;
回复 使用道具 举报

补充一个
一行代码实现的交换:
  1. public class OneLineSwap
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 //一、用加减一行代码实现两个数的交换
  6.                 int a = 3;
  7.                 int b = 4;
  8.                 System.out.println("交换前:"+"a = "+a+":"+"b = "+b);
  9.                 //a = a+b-(b=a);
  10.                 //b =a+b-(a=b);
  11.                 b = a-b+(a=b);
  12.                 System.out.println("交换后:"+"a = "+a+":"+"b = "+b);
  13.                 System.out.println("==================");
  14.                 //二、用异或一行代码
  15.                 int x = 5;
  16.                 int y = 8;
  17.                 System.out.println("交换前:"+"x = "+x+":"+"y = "+y);
  18.                 //x = x^y^(y=x);
  19.                 y = x^y^(x=y);
  20.                 System.out.println("交换后:"+"x = "+x+":"+"y = "+y);
  21.         }
  22.        
  23. }
复制代码
回复 使用道具 举报
二楼那个同学说的很对。如果要交换数字,我们现在接触最多的就只有三种:第一种就是用第三方变量,这是大部分都知道的;第二种就是用+-来实现的 x = x+y;
y = x - y;  x = x - y;  第三种就是面试时企业想要看到的一种方法:用异或来运算,x = x ^ y;   y = x ^ y;    x = x ^ y;


   
回复 使用道具 举报
老师讲了两种方法,
第一种方法:
x=x+y;
y=x-y;
x=x-y;
第二种方法:用异或^来实现,一个数A异或同一个数B两次,结果是A。
x = x ^ y;
y = x ^ y;
x = x ^ y;
,看上面都有人回答了,我是不是来晚了,55555.
回复 使用道具 举报
老师讲了两种方法,
第一种方法:
x=x+y;
y=x-y;
x=x-y;
第二种方法:用异或^来实现,一个数A异或同一个数B两次,结果是A。
x = x ^ y;
y = x ^ y;
x = x ^ y;
,看上面都有人回答了,我是不是来晚了,55555.
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马