面试题之不引入新变量,做两个变量值的交换(日常涨知识)

56 阅读2分钟

给你两个变量,怎样不引入新变量,完成两个变量的值交换

(面试题)菜鸟继续学习吧!!!贴代码

方法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

推荐使用: 在实际开发中,推荐使用异或运算的方式,因为它:

不会有溢出问题 执行效率高 虽然可读性稍差,但作为经典算法被广泛认可