黑马程序员技术交流社区

标题: 交换两个变量的值不依靠第三方变量的一点小感想 [打印本页]

作者: 黑马-郑鹏    时间: 2012-8-12 17:39
标题: 交换两个变量的值不依靠第三方变量的一点小感想
如题:假设n=13,m=41,对n和m中的值进行交换,使m=13,n=41
在毕祥东老师的视频中,给我们提供了三种方法可以实现这个功能
class Exchange{
public static void main(String[] args){  
  int m = 41;
  int n = 13;
  int temp = 0;
  System.out.println("n="+n+"m="+m);
  /*
  第一种方法,借助第三方变量  
  temp = m ;
  m = n ;
  n = temp;
  第二种方法,不借助第三方变量  
  n = n + m ;//用n的值保存n+m的值
  m = n - m ;//(n+m)-m = n
  n = n - m ;//(n+m)-(n+m-m)=m
  */
  /*但是上述方法有一个限制,如果m和n的和大于n的范围时,此种方法就会失效*/
  /*第三种方法,不借组第三方变量,利用异或运算  */
  n = n ^ m ;
  m = n ^ m ;//m=(n^m)^m = n
  n = n ^ m ;//n=(n^m)^m = m
  /* 第三种方法不会发生第二种方法那样超出范围的问题,但是需要一定的技巧,比较难想到。 */   
  System.out.println("n="+n+"m="+m);
}
}
从不借助第三方变量的两种方法中可以得到如下结论:
要实现不借助变量实现两个变量进行交换,通过一个其中的一个变量(如n)先保存两个变量进行某种运算的结果,只要这个结果能与剩下的变量(如m)进行运算得到n的值,然后n与m进行运算得到m的值。只要能够满足这样条件的运算都能实现不依靠第三方变量而实现两个变量值的交换。
如  n=n*m
        m=n/m
      n=n/m
上面这种方法也同第二种方法一样具有局限性。但是想通过这样的举例加深对第二种和第三种方法的理解。
上述纯属个人学习中想到一点感想,大侠们看了请注意牙齿。如果真能带给大家些许帮助,是吴之幸矣。


作者: 魏-玉-彪    时间: 2012-8-12 19:13
思路是不错,表扬一下,相比较而言,第一种方法最直观,第二三种方法不符合正常人逻辑,可能让读代码的人思考一下
作者: 黑马连家华    时间: 2012-8-12 19:31
厉害 但有没有发现  第二种第三种和你的例子都是同一类:不需要第三方变量的变量值交换运算
作者: 黑马-郑鹏    时间: 2012-8-12 19:38
是,我的意思是通过第二种方法和第三种方法总结了一下才得出了我例举的那个例子,从而知道交换两个变量的值不依靠第三方变量不止第二种方法和第三种方法,还有别的方法,只要能满足一定的条件都行。
作者: 王舜民    时间: 2012-8-12 19:43
魏-玉-彪 发表于 2012-8-12 19:13
思路是不错,表扬一下,相比较而言,第一种方法最直观,第二三种方法不符合正常人逻辑,可能让读代码的人思 ...

这。毕向东前期视频里就讲过了,这也能拿分。。。。。我都写到日记里面去了




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