两个数交换操作

2014/12/13 16:28 下午 posted in  坏笔记不如好记性

如果给你两个整型变量,然后交换两个整数,你有多少种方法?

中间变量法

最常用的方法,就像两个杯子之间倒换水一样,先找个中间变量,然后倒换。

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);
    }
}