[前缀和]leetcode5304:子数组异或查询(medium)

题目:

https://leetcode-cn.com/problems/xor-queries-of-a-subarray/

题解:

  • 前缀和模板题,记住异或运算:0^x=x、x^x=0
  • 至于为什么前缀和要比原数组多一个的原因:假设要求data[0…i],那么就需要pre[i] - pre[-1]。我们就多一个0,变成pre[i+1]-pre[0];所以[0,i]的异或值为等于pre[i+1]^pre[0]。

代码如下:

class Solution {
public:
    vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& queries) {
        vector<int> res;
        int n=arr.size();
        /*for(int i=0;i<n;++i)
        {
            int a=queries[i][0],b=queries[i][1];
            int temp=arr[a];
            for(int j=a+1;j<=b;++j){
                temp^=arr[j];
            }
            res.push_back(temp);
        }*/
        //前缀和数组要比原数组多一个的原因:
        //假设要求data[0..i],那么就需要pre[i] - pre[-1]。我们就多一个0,变成pre[i+1]-pre[0]
        vector<int> pre(n+1,0);
        for(int i=0;i<n;++i){
            pre[i+1]=pre[i]^arr[i];
        }
        for(auto& it:queries){
            res.push_back(pre[it[1]+1]^pre[it[0]]);
        }
        return res;
    }
};
发布了484 篇原创文章 · 获赞 149 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/103849292