题目来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/xor-queries-of-a-subarray
题目描述
有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]。
对于每个查询 i,请你计算从 Li 到 Ri 的 XOR 值(即 arr[Li] xor arr[Li+1] xor … xor arr[Ri])作为本次查询的结果。
并返回一个包含给定查询 queries 所有结果的数组。
题目思路
首先要知道a ^ a = 0,0 ^ a = a,a ^ b ^ c ^ (a ^ b ^ c ^ d) = d
思路是:
- 先构建一个x数组,令第一个元素为0。
- 遍历arr数组中的元素让x数组之后每一个元素与其前一个元素异或。
- 假如是arr = [a,b,c,d],其得到的x数组为[0, a, a ^ b, a ^ b ^ c, a ^ b ^ c ^ d]。
- 遍历queries数组中的每个元素,就比如题目给的queries[0] = [2, 3],就让result[0] = x[2] ^ x[3+1] = c ^ d。
- 最后得到结果。
c语言题解
int* xorQueries(int* arr, int arrSize, int** queries, int queriesSize, int* queriesColSize, int* returnSize){
int i, j;
int x[arrSize + 1];
*returnSize = queriesSize;
int* result = malloc(sizeof(int) * queriesSize);
x[0] = 0;
/*
创建一个x数组,如下所示
x[1] = 0^arr[0] = 0
x[2] = 0^1
x[3] = 0^1^2
x[4] = 0^1^2^3
*/
for (i = 0; i < arrSize; i++) {
x[i + 1] = x[i] ^ arr[i];
}
/*
[0,1]: r[0] = x[0] ^ x[2]
[1,2]: r[1] = x[1] ^ x[3]
*/
for (i = 0; i < queriesSize; i++) {
result[i] = x[queries[i][0]] ^ x[queries[i][1] + 1];
}
return result;
}