如果给你两个整型变量,然后交换两个整数,你有多少种方法?
中间变量法
最常用的方法,就像两个杯子之间倒换水一样,先找个中间变量,然后倒换。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int num1 = s.nextInt(),num2 = s.nextInt();
int tmp = num1;
num1 = num2;
num2 = tmp;
System.out.println("num1 = " + num1 + 't' + "num2 = " + num2);
}
}
作差法
作差法的好处就是可以少开一个变量,但是要承担溢出的风险。
用杯子倒水已经不合适形容了,最方便的就是袋子中放西瓜。A袋子里有代号为a的西瓜,B袋子里有代号为b的西瓜,小笨球想让两个袋子的西瓜倒换,但是一次只能拿出一个西瓜(拿出来之后必须放在袋子里不能放在地上云云)。
那么就可以把a拿到B袋子中,然后B中就有ab两个西瓜。
再把B中的b放到A的袋子中,那么就倒换完毕。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int num1 = s.nextInt(),num2 = s.nextInt();
num1 += num2;
num2 = num1 - num2;
num1 = num1 - num2;
System.out.println("num1 = " + num1 + 't' + "num2 = " + num2);
}
}
位异或法
位处理法是最棒的方法,既不需要开辟新的空间,又不会承担溢出的风险,唯一的缺点就是:不好理解。
先说说位异或,对位进行处理,同假异真。
位异或可以使得两个2进制串合并压缩成1个2进制串,然后用其中任意一个便可以求得另一个。
话句话说:
(a ^ b) ^ a == b;
(a ^ b) ^ b == a;
所以,交换两个数的时候只需要:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int num1 = s.nextInt(),num2 = s.nextInt();
num1 ^= num2;
num2 ^= num1;
num1 ^= num2;
System.out.println("num1 = " + num1 + 't' + "num2 = " + num2);
}
}