mirror of https://github.com/doocs/leetcode.git
2.9 KiB
2.9 KiB
| comments | difficulty | edit_url |
|---|---|---|
| true | 中等 | https://github.com/doocs/leetcode/edit/main/lcci/16.01.Swap%20Numbers/README.md |
面试题 16.01. 交换数字
题目描述
编写一个函数,不用临时变量,直接交换numbers = [a, b]中a与b的值。
示例:
输入: numbers = [1,2] 输出: [2,1]
提示:
numbers.length == 2
解法
方法一:位运算
我们可以使用异或运算 \oplus 来实现两个数的交换。
异或运算有以下三个性质。
- 任何数和
0做异或运算,结果仍然是原来的数,即a \oplus 0=a。 - 任何数和其自身做异或运算,结果是
0,即a \oplus a=0。 - 异或运算满足交换律和结合律,即
a \oplus b \oplus a=b \oplus a \oplus a=b \oplus (a \oplus a)=b \oplus 0=b。
因此,我们可以对 numbers 中的两个数 a 和 b 进行如下操作:
a=a \oplus b,此时a中存储了两个数的异或结果;b=a \oplus b,此时b中存储了原来a的值;a=a \oplus b,此时a中存储了原来b的值;
这样,我们就可以实现在不使用临时变量的情况下对两个数进行交换。
时间复杂度 O(1),空间复杂度 O(1)。
Python3
class Solution:
def swapNumbers(self, numbers: List[int]) -> List[int]:
numbers[0] ^= numbers[1]
numbers[1] ^= numbers[0]
numbers[0] ^= numbers[1]
return numbers
Java
class Solution {
public int[] swapNumbers(int[] numbers) {
numbers[0] ^= numbers[1];
numbers[1] ^= numbers[0];
numbers[0] ^= numbers[1];
return numbers;
}
}
C++
class Solution {
public:
vector<int> swapNumbers(vector<int>& numbers) {
numbers[0] ^= numbers[1];
numbers[1] ^= numbers[0];
numbers[0] ^= numbers[1];
return numbers;
}
};
Go
func swapNumbers(numbers []int) []int {
numbers[0] ^= numbers[1]
numbers[1] ^= numbers[0]
numbers[0] ^= numbers[1]
return numbers
}
TypeScript
function swapNumbers(numbers: number[]): number[] {
numbers[0] ^= numbers[1];
numbers[1] ^= numbers[0];
numbers[0] ^= numbers[1];
return numbers;
}
Swift
class Solution {
func swapNumbers(_ numbers: [Int]) -> [Int] {
var numbers = numbers
numbers[0] ^= numbers[1]
numbers[1] ^= numbers[0]
numbers[0] ^= numbers[1]
return numbers
}
}