LeetCode 面试题 16.01. 交换数字

编写一个函数,不用临时变量,直接交换numbers = [a, b]中a与b的值。

示例:

输入: numbers = [1,2] 输出: [2,1] 提示:

numbers.length == 2

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/swap-numbers-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

其中有一种写法挺奇怪的 利用异或运算

  public int[] swapNumbers(int[] numbers) {
        numbers[0] ^= numbers[1];
        numbers[1] ^= numbers[0];
        numbers[0] ^= numbers[1];
        return numbers;
    }

作者:sdwwld
链接:https://leetcode-cn.com/problems/swap-numbers-lcci/solution/javabu-shi-yong-lin-shi-bian-liang-de-3chong-fang-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在CS:APP《深入理解计算机系统》这本书有个练习题就是写这个
在这里插入图片描述
看完这个豁然开朗
另外下面还有一个练习题
在这里插入图片描述
我刚开始以为是 x=y会发生这种情况,其实不是的

当x=y

  1. y=0
  2. x=x
  3. y=x

所以没有影响。

问题就出在当 &x = &y的时候

  1. y=0
  2. x=0
  3. y=0

LeetCode这题就避开了这个坑,因为题目规定了是在数组里。

其实我更喜欢另一种写法

  public int[] swapNumbers(int[] numbers) {
        numbers[0] += numbers[1];
        numbers[1] = numbers[0]-number[1];
        numbers[0] -= numbers[1];
        return numbers;
    }

这种方法不涉及太复杂的原理。小学生都懂。
但是这种方法也存在溢出的风险。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值