算法-子数组异或查询
子数组异或查询
题目
有一个正整数数组 arr
,现给你一个对应的查询数组 queries
,其中 queries[i] = [Li, Ri]
。
对于每个查询 i
,请你计算从Li
到 Ri
的 XOR
值(即 arr[Li] xor arr[Li+1] xor ... xor arr[Ri]
)作为本次查询的结果。
并返回一个包含给定查询 queries
所有结果的数组。
- 示例 1
输入:arr = [1, 3, 4, 8], queries = [[0, 1], [1, 2], [0, 3], [3,3]]
输出:[2, 7, 14, 8]
解释:
[0,1] = 1 xor 3 = 2
[1,2] = 3 xor 4 = 7
[0,3] = 1 xor 3 xor 4 xor 8 = 14
[3,3] = 8
- 示例 2
输入:arr = [4, 8, 2, 10], queries = [[2, 3], [1, 3], [0, 0], [0, 3]]
输出:[8, 0, 4, 4]
思路
- 由于
a ^ 0 = a, a ^ b ^ a = b
- 我们可以得到在区间
[i, j]
上的异或
1 | xors[j + 1] = (arr[0] ^ arr[1] ^ ... ^ arr[j]); |
步骤
- 建立
xors
数组保存arr前n项异或 - 遍历
queries
数组,获取所求区间[i, j]
- 求值
xors[i] ^ xors[j + 1]
,添加到返回的数组中
代码
1 | /** |