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上的题目示例
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);
}