一、题目
有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]。
对于每个查询 i,请你计算从 Li 到 Ri 的 XOR 值(即 arr[Li] xor arr[Li+1] xor … xor arr[Ri])作为本次查询的结果。
并返回一个包含给定查询 queries 所有结果的数组。
二、思路
该题首先想到的就是暴力法,直接根据题意,每次都从arr[Li]依次异或运算到arr[Ri]即可。
但是这样做的时间复杂度较高,需要使用记忆化来缩减时间复杂度,不需要重复计算异或,直接可以获得需要的值。根据异或运算中的规则,同样的数字经历偶数次运算即可抵消(如:num^num=0)。
设定一个数组memo,memo[i]=arr[0]^arr[1]^…^arr[i-1],也就是0到i-1项的异或结果,那么需要的答案ans[i]=arr[Li]^arr[Li+1]^…^arr[Ri]=memo[Li]^memo[Ri+1]。
三、代码
class Solution {
public int[] xorQueries(int[] arr, int[][] queries) {
int[] memo = new int[arr.length + 1];
memo[0] = 0;
for (int i = 1; i < memo.length; i++) {
memo[i] = memo[i-1]^arr[i-1];
}
int[] ans = new int[queries.length];
for (int i = 0; i < queries.length; i++) {
ans[i] = memo[queries[i][0]]^memo[queries[i][1] + 1];
}
return ans;
}
}
空间复杂度为O(arr.length),时间复杂度为O(queries.length + arr.length)。