黑马程序员技术交流社区

标题: 将两个数内容交换和交换两个整数 [打印本页]

作者: asinzuo    时间: 2015-8-5 12:12
标题: 将两个数内容交换和交换两个整数
将两个数内容交换和交换两个整数有区别吗?
还有,下面三种交换方法 有区别吗?

                                int a = 153 ;
                                int b = 407 ;

                                方法1:                               
                                a = a^b;
                                b = a^b;
                                a = a^b;
                               

                                方法2
                                int temp = a;
                                a = b ;
                                b = temp ;

                                方法3
                                a = a + b ;
                                b = a - b ;
                                a = a - b ;       


作者: Eil.tea    时间: 2015-8-5 12:12
当然有区别,先说第二种,引入的一个中间变量,在内存中多开辟了一块内存。
再说第三种,加和可能引起变量内存溢出
第一种使用位运算,避免了第三种可能出现的情况,但是只能用于整形运算,各有利弊。
作者: asinzuo    时间: 2015-8-5 12:43
怎么破?
作者: 走在冷风中    时间: 2015-8-5 15:49
楼上解释很详尽..
作者: 徐鹏辰    时间: 2015-8-5 15:58
方法1:异或同一个数,属于技巧性的换位,
方法2:引用中间值换位,简单易懂,较常用
方法3:求和换位,当数值很大时,易超出int范围
作者: asinzuo    时间: 2015-8-5 16:22
Eil.tea 发表于 2015-8-5 13:51
当然有区别,先说第二种,引入的一个中间变量,在内存中多开辟了一块内存。
再说第三种,加和可能引起变量 ...

将两个数内容交换和交换两个整数有区别吗?这句话怎么理解?
作者: asinzuo    时间: 2015-8-5 16:24
徐鹏辰 发表于 2015-8-5 15:58
方法1:异或同一个数,属于技巧性的换位,
方法2:引用中间值换位,简单易懂,较常用
方法3:求和换位,当 ...

标题怎么解释?
作者: 王勋亮    时间: 2015-8-5 17:14
楼上解释很到位!!!
作者: 895928691    时间: 2015-8-6 21:50
可以用函数指针交换
作者: STARlove    时间: 2015-8-6 21:51
小数据。。没什么区别的。。数据多了,,他们所运行的速度和所开辟的空间就不一样了
作者: asinzuo    时间: 2015-8-7 09:01
STARlove 发表于 2015-8-6 21:51
小数据。。没什么区别的。。数据多了,,他们所运行的速度和所开辟的空间就不一样了  ...

在书上看到两个题目,一个是:将两个数内容交换,还有一个题目是:交换两个整数。这两个题目意思有区别吗。
作者: l_15562009298    时间: 2015-8-7 12:58
方法1:一个变量异或两次得到原引用,与方法3的相似之处在于变量间的换位没有开辟第三的变量;

方法2:是很普通的变量之间的换位


作者: fmi110    时间: 2015-8-7 16:35
asinzuo 发表于 2015-8-7 09:01
在书上看到两个题目,一个是:将两个数内容交换,还有一个题目是:交换两个整数。这两个题目意思有区别吗。 ...

题目有点不严谨我 觉得,数应该说大小而不是内容。因为数不是容器,不存储东西  哈哈

话说回来,这两个题目是有区别:
第二题:直接给出了数的类型是int
第一题:直说是数,所以接受的参数可能是整数,也可能是小数,所以第一题是设置了陷阱的  考察是否审题仔细,对于接受多种类型的数据但功能一样的函数  可以通过函数重载的方式实现。
作者: fmi110    时间: 2015-8-7 16:42
我再来提供一个方法,可以避免值溢出

  方法4
                                a = a - b ;   //a是a和b的差值
                                b = b + a ; //b加上  (a和b的差值) 等于  a
                                a = b - a ; // a 减去 (a和b的差值)  等于  b
作者: iamzk    时间: 2015-8-14 19:35
可以这样写:a = a + b - (b = a);
这样就不会有以上问题了。
  1. class Exchange
  2. {
  3.         public static void main(String []args)
  4.         {
  5.                 int a = 5,b = 4;
  6.                 a = a + b - (b = a);
  7.                 System.out.println("a=" + a + ",b=" + b);
  8.                
  9.                 }
  10. }
复制代码

QQ截图20150814193712.jpg (11.66 KB, 下载次数: 17)

QQ截图20150814193712.jpg





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