1. 问题背景与题目解析
"选数异或"是蓝桥杯省赛A组的一道经典算法题,主要考察选手对位运算和动态规划的理解。题目通常给出一个长度为n的数组和一个目标值x,要求找出数组中满足a[i] XOR a[j] = x的数对(i,j)的数量,其中i < j。
这道题在2014年蓝桥杯省赛中首次出现后,就成为算法竞赛中的经典题型。它看似简单,但想要在竞赛时间内高效解决,需要深入理解异或运算的特性和巧妙的算法设计。
提示:异或运算(XOR)是位运算中的一种,其特点是相同为0,不同为1。这个特性在解决本题时非常关键。
1.1 题目具体描述
假设题目给出:
- 一个整数数组nums = [a1, a2, ..., an]
- 一个整数x
要求计算数组中满足以下条件的数对(i,j)的数量:
- 0 ≤ i < j < n
- nums[i] XOR nums[j] == x
例如:
输入:nums = [1,2,3,4,5], x = 3
输出:2
解释:(0,1)因为1 XOR 2 = 3;(1,3)因为2 XOR 4 = 3
2. 暴力解法与复杂度分析
2.1 最直观的暴力解法
对于算法初学者来说,最直接的思路是使用双重循环枚举所有可能的数对:
python复制def count_xor_pairs(nums, x):
count = 0
n = len(nums)
for i in range(n):
for j in range(i+1, n):
if nums[i] ^ nums[j] == x:
count += 1
return count
这种解法的时间复杂度是O(n²),对于小规模数据(n≤1000)尚可接受,但在蓝桥杯竞赛中,n的规模通常达到10⁵,这样的解法显然会超时。
2.2 暴力解法的优化空间
观察暴力解法,我们发现内层循环其实是在寻找满足nums[j] == nums[i] ^ x的元素。如果能快速统计这样的元素数量,就能优化算法。
这提示我们可以使用哈希表(字典)来存储元素出现的次数,将查找操作从O(n)降到O(1)。
