给你两个变量,怎样不引入新变量,完成两个变量的值交换
(面试题)菜鸟继续学习吧!!!贴代码
方法1:使用加减法运算
public class SwapExample {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("交换前: a = " + a + ", b = " + b);
// 使用加减法交换
a = a + b; // a现在存储两数之和
b = a - b; // b = (a+b) - b = 原来的a
a = a - b; // a = (a+b) - 原来的a = 原来的b
System.out.println("交换后: a = " + a + ", b = " + b);
}
}
交换前: a = 10, b = 20
交换后: a = 20, b = 10
方法2:使用异或运算(XOR)
public class SwapExample {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("交换前: a = " + a + ", b = " + b);
// 使用异或运算交换
a = a ^ b; // a存储a和b的异或结果
b = a ^ b; // b = (a^b) ^ b = a
a = a ^ b; // a = (a^b) ^ a = b
System.out.println("交换后: a = " + a + ", b = " + b);
}
}
交换前: a = 10, b = 20
交换后: a = 20, b = 10
两种方法的比较:
加减法的优点和缺点:
优点:逻辑直观,容易理解
缺点:存在整数溢出风险。如果两个数相加超过Integer.MAX_VALUE,会导致溢出
异或运算的优点和缺点:
优点:不会发生溢出,效率较高
缺点:逻辑相对复杂,不易理解 完整示例(包含溢出测试):
public class SwapComparison {
public static void main(String[] args) {
// 正常情况测试
testAdditionMethod(10, 20);
testXORMethod(10, 20);
// 溢出情况测试
int largeNum1 = Integer.MAX_VALUE;
int largeNum2 = Integer.MAX_VALUE - 1;
System.out.println("\n=== 溢出测试 ===");
System.out.println("原值: a = " + largeNum1 + ", b = " + largeNum2);
// 加减法在溢出情况下会出错
int a1 = largeNum1, b1 = largeNum2;
a1 = a1 + b1;
b1 = a1 - b1;
a1 = a1 - b1;
System.out.println("加减法结果: a = " + a1 + ", b = " + b1);
// 异或运算不受溢出影响
int a2 = largeNum1, b2 = largeNum2;
a2 = a2 ^ b2;
b2 = a2 ^ b2;
a2 = a2 ^ b2;
System.out.println("异或运算结果: a = " + a2 + ", b = " + b2);
}
static void testAdditionMethod(int a, int b) {
System.out.println("=== 加减法交换 ===");
System.out.println("交换前: a = " + a + ", b = " + b);
a = a + b;
b = a - b;
a = a - b;
System.out.println("交换后: a = " + a + ", b = " + b);
}
static void testXORMethod(int a, int b) {
System.out.println("=== 异或运算交换 ===");
System.out.println("交换前: a = " + a + ", b = " + b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("交换后: a = " + a + ", b = " + b);
}
}
=== 加减法交换 ===
交换前: a = 10, b = 20
交换后: a = 20, b = 10
=== 异或运算交换 ===
交换前: a = 10, b = 20
交换后: a = 20, b = 10
=== 溢出测试 ===
原值: a = 2147483647, b = 2147483646
加减法结果: a = 2147483646, b = 2147483647
异或运算结果: a = 2147483646, b = 2147483647
推荐使用: 在实际开发中,推荐使用异或运算的方式,因为它:
不会有溢出问题 执行效率高 虽然可读性稍差,但作为经典算法被广泛认可