劍指Offer(Java版):不用第三個變量就能交換兩個變量值

題目:java

不用第三個變量就能交換兩個變量值

package cglib;算法

import java.util.Stack;安全

public class jiekou {spa

    //第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");
        }  
    }.net

 


輸出:
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)加減法、乘除法、異或法get

2)使用中間變量(指針、引用)string

3)當要求不使用指針,而且不使用中間變量時,只能使用異或法ast

4)當是浮點數時,不能使用異或法

5)當b爲0時,不能使用乘除法

相關文章
相關標籤/搜索