黑马程序员技术交流社区

标题: 两个整数交换的几种方法与思考(Java版) [打印本页]

作者: sunriselzz    时间: 2013-6-21 21:17
标题: 两个整数交换的几种方法与思考(Java版)
本帖最后由 孙百鑫 于 2013-6-22 21:57 编辑

  两个整数交换的几种方法与思考(Java版)
   各方法都写在一个类中,代码的重复度高,但是为了方便参照对比与演示
    这些算法并不是在实际应用中都用到,而是为了探讨技术,展示程序设计的魅力。

  1. /**
  2.         两个整数交换的几种方法与思考(Java版)
  3.         
  4.         各方法都写在一个类中,代码的重复度高,但是为了方便参照对比与演示
  5.         这些算法并不是在实际应用中都用到,而是为了探讨技术,展示程序设计的魅力。
  6.         @author: sunriselzz
  7. */
  8. class SwapTwoNum
  9. {
  10.         public static void main(String[] args)
  11.         {
  12.                 swap1();
  13.                 swap2();
  14.                 swap3();
  15.                 swap4();
  16.         }
  17.         //方法一: 借助于第三方变量
  18.         //原理:定义一个变量,把一个值临时存放在变量中,然后两个值相互交换
  19.         public static void swap1(){
  20.                 int x=4;
  21.                 int y=2;
  22.                 System.out.println("\n借助于第三方变量\n  交换前: x="+x+" y="+y);

  23.                 int temp = x;
  24.                         x = y;
  25.                         y = temp;

  26.                 System.out.println(" 交换后: x="+x+" y="+y);
  27.         }
  28.         //方法二: 通过算术运算
  29.         //两个变量值相加,相加后的值减去后一个变量值
  30.         public static void swap2(){
  31.                 int x=4;
  32.                 int y=2;
  33.                 System.out.println("\n通过算术运算\n  交换前: x="+x+" y="+y);

  34.                         x = x + y; //变量x=6
  35.                         y = x - y; //变量y=6-2=4;
  36.                         x = x - y; //变量a=6-4=2;

  37.                 System.out.println(" 交换后: x="+x+" y="+y);
  38.         }
  39.         //方法三: 通过位运算
  40.         //此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,
  41.         //其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。
  42.         public static void swap3(){
  43.                 int x=4;
  44.                 int y=2;
  45.                 System.out.println("\n通过位运算\n  交换前: x="+x+" y="+y);

  46.                         x = x ^ y;
  47.                         y = x ^ y; //y=x^y^y=x;
  48.                         x = x ^ y; //x=x^y^x=y;

  49.                 System.out.println(" 交换后: x="+x+" y="+y);
  50.         }
  51.         //方法四: 参照的高级版,没弄明白,所以没能写出来,期盼高手普及一下!
  52.         //java中没有指针运算,"*"这个运算符还有其它的运算方式?
  53.         public static void swap4(){
  54.                 int x=4;
  55.                 int y=2;
  56.                 System.out.println("\n参照的高级版\n  交换前: x="+x+" y="+y);

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

  58.                 System.out.println(" 交换后: x="+x+" y="+y);
  59.         }


  60. }





复制代码

change.jpg (795.81 KB, 下载次数: 0)

change.jpg

作者: Kurt_cobain    时间: 2013-6-21 21:44
您这是总结吗?{:soso_e179:}
作者: hacket    时间: 2013-6-21 22:12
  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. }
复制代码

作者: sunriselzz    时间: 2013-6-21 23:55
hacket 发表于 2013-6-21 22:12

:handshake学习了
作者: 王延龙    时间: 2013-6-22 17:18
收藏下,{:soso_e100:}
作者: 孙百鑫    时间: 2013-6-22 21:57
楼主我已将您的帖子改成已解决




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2