当前位置: 面试刷题>> 数组中两个数字的最大异或 (经典算法题500道)
### 完整题目描述
给定一个非空整数数组 `nums`,数组中的元素都在 `[0, 2^31 - 1]` 的范围内。请找到数组中任意两个数字的最大异或值(XOR)。
**注意**:
- 数组中的元素可以重复使用。
- 你需要返回的是两个数字的最大异或值,而不是它们的索引。
### 示例
**输入**:`nums = [3, 10, 5, 25, 2, 8]`
**输出**:`28`
**解释**:
- `3 ^ 10 = 13`
- `3 ^ 5 = 6`
- `3 ^ 25 = 26`
- `3 ^ 2 = 1`
- `3 ^ 8 = 11`
- `10 ^ 5 = 15`
- `10 ^ 25 = 27`
- `10 ^ 2 = 8`
- `10 ^ 8 = 2`
- `5 ^ 25 = 20`
- `5 ^ 2 = 7`
- `5 ^ 8 = 13`
- `25 ^ 2 = 23`
- `25 ^ 8 = 17`
- `2 ^ 8 = 10`
最大的异或值是 `27 ^ 8 = 28`(注意这不是唯一的组合)。
### 解题思路
这个问题可以通过位运算和前缀树(Trie树)来解决。基本思路是遍历数组中的每个数字,对于每个数字,我们尝试将其与数组中的其他数字进行异或运算,以找到最大的异或值。由于直接比较的时间复杂度较高,我们可以利用前缀树来优化查找过程。
### PHP 示例代码
```php
class TrieNode {
public $children = [];
public function __construct() {
$this->children = array_fill(0, 32, null);
}
}
function findMaximumXOR($nums) {
$root = new TrieNode();
$maxXOR = 0;
// 构建前缀树
foreach ($nums as $num) {
$node = $root;
for ($i = 31; $i >= 0; $i--) {
$bit = ($num >> $i) & 1;
if (!$node->children[$bit]) {
$node->children[$bit] = new TrieNode();
}
$node = $node->children[$bit];
}
}
// 查找最大异或值
foreach ($nums as $num) {
$node = $root;
$xor = 0;
for ($i = 31; $i >= 0; $i--) {
$bit = ($num >> $i) & 1;
$oppositeBit = 1 - $bit;
if ($node->children[$oppositeBit]) {
$xor |= (1 << $i);
$node = $node->children[$oppositeBit];
} else {
$node = $node->children[$bit];
}
}
$maxXOR = max($maxXOR, $xor);
}
return $maxXOR;
}
// 示例用法
$nums = [3, 10, 5, 25, 2, 8];
echo findMaximumXOR($nums); // 输出 28
```
### Python 示例代码
```python
class TrieNode:
def __init__(self):
self.children = [None] * 2
def findMaximumXOR(nums):
root = TrieNode()
max_xor = 0
# 构建前缀树
for num in nums:
node = root
for i in range(31, -1, -1):
bit = (num >> i) & 1
if not node.children[bit]:
node.children[bit] = TrieNode()
node = node.children[bit]
# 查找最大异或值
for num in nums:
node = root
xor = 0
for i in range(31, -1, -1):
bit = (num >> i) & 1
opposite_bit = 1 - bit
if node.children[opposite_bit]:
xor |= (1 << i)
node = node.children[opposite_bit]
else:
node = node.children[bit]
max_xor = max(max_xor, xor)
return max_xor
# 示例用法
nums = [3, 10, 5, 25, 2, 8]
print(findMaximumXOR(nums)) # 输出 28
```
### JavaScript 示例代码
```javascript
class TrieNode {
constructor() {
this.children = new Array(2).fill(null);
}
}
function findMaximumXOR(nums) {
const root = new TrieNode();
let maxXOR = 0;
// 构建前缀树
for (const num of nums) {
let node = root;
for (let i = 31; i >= 0; i--) {
const bit = (num >> i) & 1;
if (!node.children[bit]) {
node.children[bit] = new TrieNode();
}
node = node.children[bit];
}
}
// 查找最大异或值
for (const num of nums) {
let node = root;
let xor = 0;
for (let i = 31; i >= 0; i--) {
const bit = (num >> i) & 1;
const oppositeBit = 1 - bit;
if (node.children[oppositeBit]) {
xor |= (1 << i);
node = node.children[oppositeBit];
} else {
node = node.children[bit];
}
}
maxXOR = Math.max(maxXOR, xor);
}
return maxXOR;
}
// 示例用法
const nums = [3, 10, 5, 25, 2, 8];
console.log(findMaximumXOR(nums)); // 输出 28
```
码小课网站中有更多相关内容分享给大家学习,包括算法基础、数据结构、面试技巧等,欢迎访问学习。