Skip to content

Commit 6252e68

Browse files
committed
feat: add solutions to lc problem: No.1310
No.1310: XOR Queries of a Subarray
1 parent fce74c0 commit 6252e68

File tree

8 files changed

+171
-92
lines changed

8 files changed

+171
-92
lines changed

solution/1300-1399/1310.XOR Queries of a Subarray/README.md

Lines changed: 72 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,20 @@
5555

5656
<!-- 这里可写通用的实现逻辑 -->
5757

58-
由于 `A ^ B = C` => `A ^ A ^ B = A ^ C` => `B = A ^ C`。因此,我们求解 `arr[l] ^ ... ^ arr[r]`,可以转换为求解 `arr[0] ^ ... ^ arr[l - 1]` ^ `arr[0] ^ ... ^ ... ^ arr[r]`
58+
**方法一:前缀异或**
5959

60-
所以,我们先求解前缀异或,再进行两数异或即可求得每一个 query 的结果。
60+
我们可以用一个长度为 $n+1$ 的前缀异或数组 $s$ 来存储数组 $arr$ 的前缀异或结果,其中 $s[i] = s[i-1] \oplus arr[i-1]$,即 $s[i]$ 表示 $arr$ 中下标 $[0,i-1]$ 的元素的异或结果。
61+
62+
那么对于一个查询 $[l,r]$,我们可以得到:
63+
64+
$$
65+
\begin{aligned}
66+
arr[l] \oplus arr[l+1] \oplus \cdots \oplus arr[r] &= (arr[0] \oplus arr[1] \oplus \cdots \oplus arr[l-1]) \oplus (arr[0] \oplus arr[1] \oplus \cdots \oplus arr[r]) \\
67+
&= s[l] \oplus s[r+1]
68+
\end{aligned}
69+
$$
70+
71+
时间复杂度 $O(n+m)$,空间复杂度 $O(n)$。其中 $n$ 和 $m$ 分别是数组 $arr$ 和查询数组 $queries$ 的长度。
6172

6273
<!-- tabs:start -->
6374

@@ -68,10 +79,8 @@
6879
```python
6980
class Solution:
7081
def xorQueries(self, arr: List[int], queries: List[List[int]]) -> List[int]:
71-
xors = [0]
72-
for v in arr:
73-
xors.append(xors[-1] ^ v)
74-
return [xors[l] ^ xors[r + 1] for l, r in queries]
82+
s = list(accumulate(arr, xor, initial=0))
83+
return [s[r + 1] ^ s[l] for l, r in queries]
7584
```
7685

7786
### **Java**
@@ -82,57 +91,37 @@ class Solution:
8291
class Solution {
8392
public int[] xorQueries(int[] arr, int[][] queries) {
8493
int n = arr.length;
85-
int[] xors = new int[n + 1];
86-
for (int i = 0; i < n; ++i) {
87-
xors[i + 1] = xors[i] ^ arr[i];
94+
int[] s = new int[n + 1];
95+
for (int i = 1; i <= n; ++i) {
96+
s[i] = s[i - 1] ^ arr[i - 1];
8897
}
8998
int m = queries.length;
9099
int[] ans = new int[m];
91100
for (int i = 0; i < m; ++i) {
92-
int l = queries[i][0];
93-
int r = queries[i][1];
94-
ans[i] = xors[l] ^ xors[r + 1];
101+
int l = queries[i][0], r = queries[i][1];
102+
ans[i] = s[r + 1] ^ s[l];
95103
}
96104
return ans;
97105
}
98106
}
99107
```
100108

101-
### **JavaScript**
102-
103-
```js
104-
/**
105-
* @param {number[]} arr
106-
* @param {number[][]} queries
107-
* @return {number[]}
108-
*/
109-
var xorQueries = function (arr, queries) {
110-
let n = arr.length;
111-
let xors = new Array(n + 1).fill(0);
112-
for (let i = 0; i < n; i++) {
113-
xors[i + 1] = xors[i] ^ arr[i];
114-
}
115-
let res = [];
116-
for (let [l, r] of queries) {
117-
res.push(xors[l] ^ xors[r + 1]);
118-
}
119-
return res;
120-
};
121-
```
122-
123109
### **C++**
124110

125111
```cpp
126112
class Solution {
127113
public:
128114
vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& queries) {
129115
int n = arr.size();
130-
vector<int> xors(n + 1);
131-
for (int i = 0; i < n; ++i) xors[i + 1] = xors[i] ^ arr[i];
116+
int s[n + 1];
117+
memset(s, 0, sizeof(s));
118+
for (int i = 1; i <= n; ++i) {
119+
s[i] = s[i - 1] ^ arr[i - 1];
120+
}
132121
vector<int> ans;
133122
for (auto& q : queries) {
134123
int l = q[0], r = q[1];
135-
ans.push_back(xors[l] ^ xors[r + 1]);
124+
ans.push_back(s[r + 1] ^ s[l]);
136125
}
137126
return ans;
138127
}
@@ -142,20 +131,59 @@ public:
142131
### **Go**
143132
144133
```go
145-
func xorQueries(arr []int, queries [][]int) []int {
146-
xors := make([]int, len(arr)+1)
147-
for i, v := range arr {
148-
xors[i+1] = xors[i] ^ v
134+
func xorQueries(arr []int, queries [][]int) (ans []int) {
135+
n := len(arr)
136+
s := make([]int, n+1)
137+
for i, x := range arr {
138+
s[i+1] = s[i] ^ x
149139
}
150-
var ans []int
151140
for _, q := range queries {
152141
l, r := q[0], q[1]
153-
ans = append(ans, xors[l]^xors[r+1])
142+
ans = append(ans, s[r+1]^s[l])
154143
}
155-
return ans
144+
return
145+
}
146+
```
147+
148+
### **TypeScript**
149+
150+
```ts
151+
function xorQueries(arr: number[], queries: number[][]): number[] {
152+
const n = arr.length;
153+
const s: number[] = new Array(n + 1).fill(0);
154+
for (let i = 0; i < n; ++i) {
155+
s[i + 1] = s[i] ^ arr[i];
156+
}
157+
const ans: number[] = [];
158+
for (const [l, r] of queries) {
159+
ans.push(s[r + 1] ^ s[l]);
160+
}
161+
return ans;
156162
}
157163
```
158164

165+
### **JavaScript**
166+
167+
```js
168+
/**
169+
* @param {number[]} arr
170+
* @param {number[][]} queries
171+
* @return {number[]}
172+
*/
173+
var xorQueries = function (arr, queries) {
174+
const n = arr.length;
175+
const s = new Array(n + 1).fill(0);
176+
for (let i = 0; i < n; ++i) {
177+
s[i + 1] = s[i] ^ arr[i];
178+
}
179+
const ans = [];
180+
for (const [l, r] of queries) {
181+
ans.push(s[r + 1] ^ s[l]);
182+
}
183+
return ans;
184+
};
185+
```
186+
159187
### **...**
160188

161189
```

solution/1300-1399/1310.XOR Queries of a Subarray/README_EN.md

Lines changed: 59 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,8 @@ The XOR values for queries are:
5555
```python
5656
class Solution:
5757
def xorQueries(self, arr: List[int], queries: List[List[int]]) -> List[int]:
58-
xors = [0]
59-
for v in arr:
60-
xors.append(xors[-1] ^ v)
61-
return [xors[l] ^ xors[r + 1] for l, r in queries]
58+
s = list(accumulate(arr, xor, initial=0))
59+
return [s[r + 1] ^ s[l] for l, r in queries]
6260
```
6361

6462
### **Java**
@@ -67,16 +65,15 @@ class Solution:
6765
class Solution {
6866
public int[] xorQueries(int[] arr, int[][] queries) {
6967
int n = arr.length;
70-
int[] xors = new int[n + 1];
71-
for (int i = 0; i < n; ++i) {
72-
xors[i + 1] = xors[i] ^ arr[i];
68+
int[] s = new int[n + 1];
69+
for (int i = 1; i <= n; ++i) {
70+
s[i] = s[i - 1] ^ arr[i - 1];
7371
}
7472
int m = queries.length;
7573
int[] ans = new int[m];
7674
for (int i = 0; i < m; ++i) {
77-
int l = queries[i][0];
78-
int r = queries[i][1];
79-
ans[i] = xors[l] ^ xors[r + 1];
75+
int l = queries[i][0], r = queries[i][1];
76+
ans[i] = s[r + 1] ^ s[l];
8077
}
8178
return ans;
8279
}
@@ -112,12 +109,15 @@ class Solution {
112109
public:
113110
vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& queries) {
114111
int n = arr.size();
115-
vector<int> xors(n + 1);
116-
for (int i = 0; i < n; ++i) xors[i + 1] = xors[i] ^ arr[i];
112+
int s[n + 1];
113+
memset(s, 0, sizeof(s));
114+
for (int i = 1; i <= n; ++i) {
115+
s[i] = s[i - 1] ^ arr[i - 1];
116+
}
117117
vector<int> ans;
118118
for (auto& q : queries) {
119119
int l = q[0], r = q[1];
120-
ans.push_back(xors[l] ^ xors[r + 1]);
120+
ans.push_back(s[r + 1] ^ s[l]);
121121
}
122122
return ans;
123123
}
@@ -127,20 +127,59 @@ public:
127127
### **Go**
128128
129129
```go
130-
func xorQueries(arr []int, queries [][]int) []int {
131-
xors := make([]int, len(arr)+1)
132-
for i, v := range arr {
133-
xors[i+1] = xors[i] ^ v
130+
func xorQueries(arr []int, queries [][]int) (ans []int) {
131+
n := len(arr)
132+
s := make([]int, n+1)
133+
for i, x := range arr {
134+
s[i+1] = s[i] ^ x
134135
}
135-
var ans []int
136136
for _, q := range queries {
137137
l, r := q[0], q[1]
138-
ans = append(ans, xors[l]^xors[r+1])
138+
ans = append(ans, s[r+1]^s[l])
139139
}
140-
return ans
140+
return
141141
}
142142
```
143143

144+
### **TypeScript**
145+
146+
```ts
147+
function xorQueries(arr: number[], queries: number[][]): number[] {
148+
const n = arr.length;
149+
const s: number[] = new Array(n + 1).fill(0);
150+
for (let i = 0; i < n; ++i) {
151+
s[i + 1] = s[i] ^ arr[i];
152+
}
153+
const ans: number[] = [];
154+
for (const [l, r] of queries) {
155+
ans.push(s[r + 1] ^ s[l]);
156+
}
157+
return ans;
158+
}
159+
```
160+
161+
### **JavaScript**
162+
163+
```js
164+
/**
165+
* @param {number[]} arr
166+
* @param {number[][]} queries
167+
* @return {number[]}
168+
*/
169+
var xorQueries = function (arr, queries) {
170+
const n = arr.length;
171+
const s = new Array(n + 1).fill(0);
172+
for (let i = 0; i < n; ++i) {
173+
s[i + 1] = s[i] ^ arr[i];
174+
}
175+
const ans = [];
176+
for (const [l, r] of queries) {
177+
ans.push(s[r + 1] ^ s[l]);
178+
}
179+
return ans;
180+
};
181+
```
182+
144183
### **...**
145184

146185
```

solution/1300-1399/1310.XOR Queries of a Subarray/Solution.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@ class Solution {
22
public:
33
vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& queries) {
44
int n = arr.size();
5-
vector<int> xors(n + 1);
6-
for (int i = 0; i < n; ++i) xors[i + 1] = xors[i] ^ arr[i];
5+
int s[n + 1];
6+
memset(s, 0, sizeof(s));
7+
for (int i = 1; i <= n; ++i) {
8+
s[i] = s[i - 1] ^ arr[i - 1];
9+
}
710
vector<int> ans;
811
for (auto& q : queries) {
912
int l = q[0], r = q[1];
10-
ans.push_back(xors[l] ^ xors[r + 1]);
13+
ans.push_back(s[r + 1] ^ s[l]);
1114
}
1215
return ans;
1316
}
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
func xorQueries(arr []int, queries [][]int) []int {
2-
xors := make([]int, len(arr)+1)
3-
for i, v := range arr {
4-
xors[i+1] = xors[i] ^ v
1+
func xorQueries(arr []int, queries [][]int) (ans []int) {
2+
n := len(arr)
3+
s := make([]int, n+1)
4+
for i, x := range arr {
5+
s[i+1] = s[i] ^ x
56
}
6-
var ans []int
77
for _, q := range queries {
88
l, r := q[0], q[1]
9-
ans = append(ans, xors[l]^xors[r+1])
9+
ans = append(ans, s[r+1]^s[l])
1010
}
11-
return ans
11+
return
1212
}

solution/1300-1399/1310.XOR Queries of a Subarray/Solution.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
class Solution {
22
public int[] xorQueries(int[] arr, int[][] queries) {
33
int n = arr.length;
4-
int[] xors = new int[n + 1];
5-
for (int i = 0; i < n; ++i) {
6-
xors[i + 1] = xors[i] ^ arr[i];
4+
int[] s = new int[n + 1];
5+
for (int i = 1; i <= n; ++i) {
6+
s[i] = s[i - 1] ^ arr[i - 1];
77
}
88
int m = queries.length;
99
int[] ans = new int[m];
1010
for (int i = 0; i < m; ++i) {
11-
int l = queries[i][0];
12-
int r = queries[i][1];
13-
ans[i] = xors[l] ^ xors[r + 1];
11+
int l = queries[i][0], r = queries[i][1];
12+
ans[i] = s[r + 1] ^ s[l];
1413
}
1514
return ans;
1615
}

solution/1300-1399/1310.XOR Queries of a Subarray/Solution.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
* @return {number[]}
55
*/
66
var xorQueries = function (arr, queries) {
7-
let n = arr.length;
8-
let xors = new Array(n + 1).fill(0);
9-
for (let i = 0; i < n; i++) {
10-
xors[i + 1] = xors[i] ^ arr[i];
7+
const n = arr.length;
8+
const s = new Array(n + 1).fill(0);
9+
for (let i = 0; i < n; ++i) {
10+
s[i + 1] = s[i] ^ arr[i];
1111
}
12-
let res = [];
13-
for (let [l, r] of queries) {
14-
res.push(xors[l] ^ xors[r + 1]);
12+
const ans = [];
13+
for (const [l, r] of queries) {
14+
ans.push(s[r + 1] ^ s[l]);
1515
}
16-
return res;
16+
return ans;
1717
};
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
class Solution:
22
def xorQueries(self, arr: List[int], queries: List[List[int]]) -> List[int]:
3-
xors = [0]
4-
for v in arr:
5-
xors.append(xors[-1] ^ v)
6-
return [xors[l] ^ xors[r + 1] for l, r in queries]
3+
s = list(accumulate(arr, xor, initial=0))
4+
return [s[r + 1] ^ s[l] for l, r in queries]
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
function xorQueries(arr: number[], queries: number[][]): number[] {
2+
const n = arr.length;
3+
const s: number[] = new Array(n + 1).fill(0);
4+
for (let i = 0; i < n; ++i) {
5+
s[i + 1] = s[i] ^ arr[i];
6+
}
7+
const ans: number[] = [];
8+
for (const [l, r] of queries) {
9+
ans.push(s[r + 1] ^ s[l]);
10+
}
11+
return ans;
12+
}

0 commit comments

Comments
 (0)