编写一个函数,不用临时变量,直接交换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
- y=0
- x=x
- y=x
所以没有影响。
问题就出在当 &x = &y的时候
- y=0
- x=0
- y=0
LeetCode这题就避开了这个坑,因为题目规定了是在数组里。
其实我更喜欢另一种写法
public int[] swapNumbers(int[] numbers) {
numbers[0] += numbers[1];
numbers[1] = numbers[0]-number[1];
numbers[0] -= numbers[1];
return numbers;
}
这种方法不涉及太复杂的原理。小学生都懂。
但是这种方法也存在溢出的风险。