原创

不借助变量如何交换两个数?

温馨提示:
本文最后更新于 2021年07月29日,已超过 341 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

一群里的小伙伴去IBM面试,面试官上来就问了一道开胃菜题目:不借助变量如何交换两个数?

这是一道比较简单的题目,但是也颇有意思,如果大家平时有刷LeetCode的习惯,第一次做这个题目应该也能做出来。

平时我们要交换一个数的时候,都是引入一个第三方变量,这样看起来也比较通俗易懂。

但既然强制不能引入新的变量,那应该怎么做呢?

  • 方法一,通过去 相减,交换数的和是不会变的
  • 方法二,异或,一个数异或两次一个相同的数,等于本身 比如说 5^13^13 = 5
public class 交换两个数 {

    public static void main(String[] args) {
        exchangeNum1(5, 8);
        System.out.println("-----------");
        exchangeNum2(5, 8);
    }

    static void exchangeNum1(int x, int y) {
        System.out.println("x的值为:" + x);
        System.out.println("y的值为:" + y);
        x = x + y;
        y = x - y;
        x = x - y;
        System.out.println("------交换后------");
        System.out.println("x的值为:" + x);
        System.out.println("y的值为:" + y);

    }

    static void exchangeNum2(int x, int y) {
//        ^ 异或,位相同为0,不同为1 , 可以理解为相加,但是不进位,结果要么是和,要么是差
        //
        System.out.println("x的值为:" + x);
        System.out.println("y的值为:" + y);
        x = x ^ y; // 5 ^ 8 = 0101 ^ 1000 = 1101 = 13
        y = x ^ y; //13 ^ 8 = 1101 ^ 1000 = 1000 = 5
        x = x ^ y; //13 ^ 8 = 1101 ^ 0101 = 1000 = 8
        System.out.println("------交换后------");
        System.out.println("x的值为:" + x);
        System.out.println("y的值为:" + y);
    }
}

这两种方法,更好的是第二种——异或,因为加减有溢出的可能性,(同样还可以使用乘除),也是面试的时候需要指出的隐患。

正文到此结束
关注公众号 【HelloCoder】
免费领取Java学习资料
让技术,化繁为简
本文目录