经典算法面试题(一):两数交换的三种方法

来源:互联网 发布:搞怪软件有哪些 编辑:程序博客网 时间:2024/05/29 16:25

代码实现:

public class SwapDemo {    private static void swap1(int[] a) {        int temp = a[0];        a[0] = a[1];        a[1] = temp;    }    private static void swap2(int[] a) {        a[0] = a[0] + a[1];        a[1] = a[0] - a[1];        a[0] = a[0] - a[1];    }    private static void swap3(int[] a) {        a[0] ^= a[1];        a[1] ^= a[0];        a[0] ^= a[1];    }    public static void main(String[] args) {        int[] a = {11, 22};        System.out.println("交换前:a[0] = " + a[0] + "," + "a[1] = " + a[1]);        swap1(a);        System.out.println("第1次交换后:a[0] = " + a[0] + "," + "a[1] = " + a[1]);        swap2(a);        System.out.println("第2次交换后:a[0] = " + a[0] + "," + "a[1] = " + a[1]);        swap3(a);        System.out.println("第3次交换后:a[0] = " + a[0] + "," + "a[1] = " + a[1]);    }}

运行结果:

交换前:a[0] = 11,a[1] = 221次交换后:a[0] = 22,a[1] = 112次交换后:a[0] = 11,a[1] = 223次交换后:a[0] = 22,a[1] = 11


知识点:
按位与运算规则:0 & 0 = 0; 0 & 1 = 0; 1 & 0 = 0; 1 & 1 = 1
按位或运算规则:0 | 0 = 0; 0 | 1 = 1; 1 | 0 = 1; 1 | 1 = 1
按位异或运算规则:0 ^ 0 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1; 1 ^ 1 = 0
按位取反运算规则:~0 = 1; ~1 = 0


注意:如果是两个很大的数,采用第2种方法交换的过程中,有可能会出现溢出现象,但结果是对的。

验证代码:

public class SwapDemo {    private static void swap(int[] a) {        a[0] = a[0] + a[1];        System.out.println("a[0] = " + a[0] + "," + "a[1] = " + a[1]);          a[1] = a[0] - a[1];        System.out.println("a[0] = " + a[0] + "," + "a[1] = " + a[1]);          a[0] = a[0] - a[1];        System.out.println("a[0] = " + a[0] + "," + "a[1] = " + a[1]);      }    public static void main(String[] args) {        int[] a = {2147483647, 2147483646};        System.out.println("交换前:a[0] = " + a[0] + "," + "a[1] = " + a[1]);        swap(a);        System.out.println("交换后:a[0] = " + a[0] + "," + "a[1] = " + a[1]);        System.out.println();        a[0] = 2147483647;        a[1] = 1;        System.out.println("交换前:a[0] = " + a[0] + "," + "a[1] = " + a[1]);        swap(a);        System.out.println("交换后:a[0] = " + a[0] + "," + "a[1] = " + a[1]);    }}

运行结果:

交换前:a[0] = 2147483647,a[1] = 2147483646a[0] = -3,a[1] = 2147483646a[0] = -3,a[1] = 2147483647a[0] = 2147483646,a[1] = 2147483647交换后:a[0] = 2147483646,a[1] = 2147483647交换前:a[0] = 2147483647,a[1] = 1a[0] = -2147483648,a[1] = 1a[0] = -2147483648,a[1] = 2147483647a[0] = 1,a[1] = 2147483647交换后:a[0] = 1,a[1] = 2147483647