文档章节

剑指Offer(Java版):不用第三个变量就能交换两个变量值

一贱书生
 一贱书生
发布于 2016/08/04 11:51
字数 1007
阅读 10
收藏 0

题目:

不用第三个变量就能交换两个变量值

package cglib;

import java.util.Stack;

public class jiekou {

    //第1种办法
    public void changeMethodA(int a, int b){
        System.out.println("changeMethodA交换之前\ta:"+a+"\tb:"+b);
        a = a + b - (b = a);
        System.out.println("changeMethodA交换之后\ta:"+a+"\tb:"+b);
    }
        //第2种办法
    public void changeMethodB(int a, int b){
        System.out.println("changeMethodA交换之前\ta:"+a+"\tb:"+b);
        b = a + (a = b)*0;
        System.out.println("changeMethodA交换之后\ta:"+a+"\tb:"+b);
    }
        
        /** 它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。
具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。
此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)
缺点:是只能用于数字类型,字符串之类的就不可以了。a+b有可能溢出(超出int的范围),溢出是相对的, +了溢出了,-回来不就好了,所以溢出不溢出没关系,就是不安全。
         * @param args
         */  
          
        public void shift(){  
            
            int a,b;
            a=10;b=12;
            a=b-a; //a=2;b=12
            b=b-a; //a=2;b=10
            a=b+a; //a=12;b=10
              
            System.out.println("a = " + a);  
            System.out.println("b = " + b);  
        }  
        /** 通过“+”运算符将a和b的运算结果赋给了a(这时a是中间变量)。然后再计算b,这时a的值已经是(a+b)了,
         * 因此,a再减b就是原来的a。 而这时b已经是原来的a了,
         * 因此,再用运算后的a(实际上是a+b)减运算后的b(实际上是原来的a),
         * 就是原来的b了,最后将这个b赋值给a。
                 * @param args
                 */  
        public void shift1(){  
            
            int a = 13;  
            int b = 21;  
      
            a = a + b;  //a=34,b=21
            b = a - b;  //a=34,b=13
            a = a - b;  //a=21,b=13
              
            System.out.println("a = " + a);  
            System.out.println("b = " + b);  
        }  
        
        
        public  void swap2()
        {
            int a = 2;  
            int b = 5;
            
            if(a*b<=0){
                
                System.out.println("值不能有0");
            }
            
            a = a * b;//a=10,b=5
            b = a / b;//a=10,b=2
            a = a / b;//a=5,b=2
            System.out.println("a = " + a);  
            System.out.println("b = " + b);  
        }
        public  void swap3()
        {   
            int a = 7;  
            int b = 8;
            
            a = a - b;//a=-1,b=8
            b = a + b;//a=-1,b=7
            a = b - a;//a=8,b=7
            System.out.println("a = " + a);  
            System.out.println("b = " + b);  
        }
        
        public  void swap5()
        {   
            int a = 3; //011
            int b = 4; //100
            
            a = a ^ b;//a=011^100=111,b=100
            b = a ^ b;//a=111,b=111^100=011
            a = a ^ b;//a=111^011=100,b=011
            
            System.out.println("a = " + a);  
            System.out.println("b = " + b);
        }
        
       public void exchange(int x,int y)
        {
         Stack<Integer> s = new Stack<>();
         s.push(x);
         s.push(y);
         x=(int) s.pop();
         y=(int) s.pop();
         
         System.out.println("x = " + x);  
         System.out.println("y = " + y);
         
        }
       
       public void exchange2(String a,String b)
       {
           a=a.concat(b);
           System.out.println("将b粘贴到a后面,a = " + a);
           b=a.replace("b","");
           System.out.println("b被空格替换后b = " + b);
           a=a.replace("a","");
           System.out.println("a被空格替换后a = " + a);
        
        System.out.println("最后a = " + a);  
        System.out.println("最后b = " + b);
        
       }
       
       
       public void exchange3(String a,String b)
       {
        //先转成int,然后用上面的
        //   a=a+b;
        //   b=a-b;
        //   a=a-b; 最后再转成String
        a = ( b + a ).substring(0,(b + ( b = a)).lastIndexOf(a)) ;
          
        System.out.println("a = " + a);  
        System.out.println("b = " + b);
        
       }
          
        public static void main(String[] args) {  
            jiekou m = new jiekou();  
            m.shift();  
            m.shift1();
            m.swap2();
            m.swap3();
            m.swap5();
            m.changeMethodA(19,20);
            m.changeMethodB(57,75);
            m.exchange(2,10);
            m.exchange2("a","b");
            m.exchange3("a","b");
        }  
    }

 


输出:
a = 12
b = 10
a = 21
b = 13
a = 5
b = 2
a = 8
b = 7
a = 4
b = 3
changeMethodA交换之前    a:19    b:20
changeMethodA交换之后    a:20    b:19
changeMethodA交换之前    a:57    b:75
changeMethodA交换之后    a:75    b:57
x = 10
y = 2
将b粘贴到a后面,a = ab
b被空格替换后b = a
a被空格替换后a = b
最后a = b
最后b = a
a = b
b = a

总结:

1)加减法、乘除法、异或法

2)使用中间变量(指针、引用)

3)当要求不使用指针,并且不使用中间变量时,只能使用异或法

4)当是浮点数时,不能使用异或法

5)当b为0时,不能使用乘除法

© 著作权归作者所有

一贱书生
粉丝 19
博文 724
码字总数 600123
作品 0
私信 提问
面试:用 Java 逆序打印链表

面试:用 Java 逆序打印链表 昨天的 Java 实现单例模式 中,我们的双重检验锁机制因为指令重排序问题而引入了 关键字,不少朋友问我,到底为啥要加 这个关键字呀,而它,到底又有什么神奇的作...

nanchen2251
2018/07/03
0
0
win7中java编程工具安装 java环境变量设置

win7中java编程工具安装 java环境变量设置 Question:编译是显示'javac'不是内部或外部命令,也不是可运行的程序或批处理文件 解决: 在【系统变量】里编辑javahome、classpath、path环境变量...

澜fish
2014/03/07
0
0
【Java】几道让你拿offer的知识点

前言 只有光头才能变强 之前在刷博客的时候,发现一些写得比较好的博客都会默默收藏起来。最近在查阅补漏,有的知识点比较重要的,但是在之前的博客中还没有写到,于是趁着闲整理一下。 文本...

Java3y
2018/08/02
0
0
win10安装jdk8 配置环境变量 听语音

win10安装jdk8 配置环境变量 听语音 | 浏览:6121 | 更新:2017-11-20 15:43 1 2 3 4 5 6 7 分步阅读 网上关于win10 jdk安装、配置环境变量的经验有很多,但是按照方法配置后出现了运行javac...

linjin200
2018/12/23
0
0
Java基础|Java特性与HelloWorld运行流程

【Java基础】 Java语言特点:(着重了解两个)开源、跨平台。 跨平台如何实现:通过JVM实现,JVM充当Java和不同OS之间的翻译器,不同OS对应不同JVM。 Java语言的平台:JavaSE、JavaME(Androi...

darlingwood2013
2018/05/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Class 文件结构

https://www.cnblogs.com/honghuzidelaoren/p/3622021.html

Java搬砖工程师
14分钟前
2
0
未分类资料

$ Inside the Linux Kernel 与知乎出产 一张漫画看懂Linux系统结构

十万猛虎下画山
14分钟前
1
0
Android人脸识别Demo竖屏YUV方向调整和图片保存

本博客包含三个常用方法,用于盛开Android版人脸识别Demo中竖屏使用时送入yuv数据,但一直无法识别的情况。 1.首先可以尝试顺时针旋转90°或270°,然后送入识别SDK。 2.旋转方向后依然无法识...

是哇兴哥棒棒哒
18分钟前
1
0
选择阿里云数据库HBase版十大理由

根据Gartner的预计,全球非关系型数据库(NoSQL)在2020~2022预计保持在30%左右高速增长,远高于数据库整体市场。 阿里云数据库HBase版也是踏着技术发展的节奏,伴随着NoSQL和大数据技术的兴...

阿里云云栖社区
30分钟前
1
0
平滑与滤波

五种常见的平滑滤波器: (1)方框型滤波器: 顾名思义,方框型滤波器就是用一个方框型的kernel跟二维图像进行卷积,其核定义如下: kernel= 其中, a = 1 当该滤波器非归一化滤波器 (1) a=...

yepanl
36分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部