JAVA不借助第三个变量交换两变量的值

Java不使用第三个变量来交换两个数的值

算术运算

public void swapData(){
    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);
    System.out.println(b);
}


a=a+b;//a的值变成了a+b的和
b=a-b;//相当于a+b-b,结果就是原来a的值赋值给了b
a=a-b;//相当于a+b-a,结果就是把原来的b的值赋值给了a


交换字母

以Leetcode上的题目示例

344. 反转字符串

class Solution {
    public void reverseString(char[] s) {
        int L=0, R=s.length-1;
        while(L<R){
            s[L]=(char)(s[R]-s[L]);
            s[R]=(char)(s[R]-s[L]);
            s[L]=(char)(s[L]+s[R]);
            L++;
            R--;
        }
    }
}

位运算

此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。

a^ b^ b=a。将a=a ^ b代入b=a^ b则得b=a^ b^ b=a;同理可以得到a=b^ a^a=b;轻松完成交换。

public void swapData2() {
    int a=10,b=12; //a=1010^b=1100;
    a=a^b; //a=0110^b=1100;
    b=a^b; //a=0110^b=1010;
    a=a^b; //a=1100=12;b=1010;

    System.out.println(a);
    System.out.println(b);

}

交换字母

同样是Leetcode上的题目

class Solution {
    public void reverseString(char[] s) {
        int L=0, R=s.length-1;
        while(L<R){
            s[L]=(char)(s[L]^s[R]);
            s[R]=(char)(s[L]^s[R]);
            s[L]=(char)(s[L]^s[R]);
            L++;
            R--;
        }
    }
}

通过栈实现

/**
* 3、栈实现
* (a = 10, b = 2) -> (a = 2, b = 10)
*/
public static void stack() {
    Stack<Integer> stack = new Stack<>();
    stack.push(a);
    stack.push(b);

    a = stack.pop();
    b = stack.pop();

    System.out.println("a:" + a + "; b:" + b);
}

参考文章: 【java】java 如何不使用第三个变量来交换两个数的值

你可能感兴趣的:(Java,java,经验分享)