思路:可以设置一个前缀异或数组mid,此数组第一个元素为0,往后第i个元素记录的就是arr的0~i-1元素的异或。对于区间[left,right]来说,我们可以已知0到left前一个元素的异或结果是mid[left](没有减一是由于第一个元素为0),0到right的异或结果是mid[right+1],由a^a=0可以求得left到right的异或结果就是mid[right+1]异或上mid[left],刚好把前left个元素消去。
class Solution {
public:
vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& queries) {
vector<int> mid(arr.size()+1);
mid[0]=0;
for(int i=1;i<=arr.size();++i)
mid[i]=mid[i-1]^arr[i-1];
vector<int> result;
for(auto& v:queries)
result.push_back(mid[v[1]+1]^mid[v[0]]);
return result;
}
};
此算法时间复杂度只有O(n+m)n为queries数组大小,m为mid数组大小。