编写一个函数,不用临时变量,直接交换 numbers = [a, b]
中 a
与 b
的值。
示例:
输入: numbers = [1,2]
输出: [2,1]
提示:
numbers.length == 2
-2147483647 <= numbers[i] <= 2147483647
恰逢前两天看到过位运算的方法,这里刚好用上了哈哈。使用异或操作可以交换两个 int 型变量的值而无需临时变量,异或满足交换律与结合律,具体运算如下:
1 ⊕ 1 = 0 1 ⊕ 0 = 1 0 ⊕ 1 = 1 0 ⊕ 0 = 0 1⊕1=01⊕0=10⊕1=10⊕0=0 1⊕1=01⊕0=10⊕1=10⊕0=0
可以发现,两个相同的数异或结果均为 0:
1
⊕
1
=
0
0
⊕
0
=
0
1⊕1=00⊕0=0
1⊕1=00⊕0=0
1/0和0异或结果均不变:
1
⊕
0
=
1
0
⊕
0
=
0
1⊕0=10⊕0=0
1⊕0=10⊕0=0
因此,对于整数 a 进行异或运算,有如下性质:
a
⊕
a
=
0
a
⊕
0
=
a
a⊕a=0a⊕0=a
a⊕a=0a⊕0=a
给定两个整数 a 和 b,进行如下操作:
a ′ = a ⊕ b b ′ = a ′ ⊕ b = a ⊕ b ⊕ b = a ⊕ 0 = a a ′ ′ = a ′ ⊕ b ′ = a ′ ⊕ a = a ⊕ b ⊕ a = a ⊕ a ⊕ b = 0 ⊕ b = b a′=a⊕bb′=a′⊕b=a⊕b⊕b=a⊕0=aa″=a′⊕b′=a′⊕a=a⊕b⊕a=a⊕a⊕b=0⊕b=b a′=a⊕bb′=a′⊕b=a⊕b⊕b=a⊕0=aa′′=a′⊕b′=a′⊕a=a⊕b⊕a=a⊕a⊕b=0⊕b=b
因此,给出代码如下(很整齐的代码hh):
public class Solution {
public int[] SwapNumbers(int[] numbers) {
numbers[0] = numbers[0] ^ numbers[1];
numbers[1] = numbers[0] ^ numbers[1];
numbers[0] = numbers[0] ^ numbers[1];
return numbers;
}
}
当然,实际使用时不建议这样写,因为可读性太差。这里只是为了做题~