class Solution {
public int[] xorQueries(int[] arr, int[][] queries) {
/*int[] result = new int[queries.length];
for (int i = 0; i < queries.length; i++) {
int l = queries[i][0];
int r = queries[i][1];
System.out.println(String.format("i:%d,j:%d", l,r));
int k = 0;
for (int j = l ; j <= r && j < arr.length; j++) {
k ^= arr[j];
}
result[i] = k;
}
return result;*/
int[] pre = new int[arr.length + 1];
//从i=1开始是为了留出空位,避免抵消了0位的数字
pre[0] = 0;
for (int i = 1; i <= arr.length; i++) {
pre[i] = pre[i - 1] ^ arr[i - 1];
}
int[] ans = new int[queries.length];
for (int i = 0; i < queries.length; i++) {
ans[i] = pre[queries[i][0]] ^ pre[queries[i][1] + 1];
}
return ans;
}
}
注释部分是一开始看到数据范围,尝试暴力的代码,恰好过了应该是
新的是用一个临时数组存储了前i个数据的异或结果
由于数字异或本身 = 0,所以只需要将 pre[l] ^ pre[r+1]则可以将 < l 部分的数据抵消