题目
思路
根据异或运算的特点(x ^ x = 0
),一个数组中任何一个区间内元素的异或结果可以通过整个数组的前缀元素异或结果求得,即有
xor(a, b) = xor(0, a-1) ^ xor(0, b-1)
根据该特点,我们只需要遍历原数组,求出所有的前缀元素异或结果并保存在一个数组中即可实现在 O ( 1 ) O(1) O(1)的时间内求出任意区间的异或值。
代码
class Solution {
public:
vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& queries) {
vector<int> result(queries.size());
int dp[3 * 10000];
int cur = 0;
for(int i=0; i<arr.size(); i++) {
cur ^= arr[i];
dp[i] = cur;
}
for(int i=0; i<queries.size(); i++) {
vector<int> &v = queries[i];
if (v[0] > 0) {
cur = dp[v[0] - 1] ^ dp[v[1]];
} else {
cur = dp[v[1]];
}
result[i] = cur;
}
return result;
}
};