Skip to content

feat: add solutions to lc problem: No.1442 #4267

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,13 @@ tags:

<!-- solution:start -->

### 方法一
### 方法一:枚举

根据题目描述,要找到满足 $a = b$ 的三元组 $(i, j, k)$,即满足 $s = a \oplus b = 0$,我们只需要枚举左端点 $i$,然后计算以 $k$ 为右端点的区间 $[i, k]$ 的前缀异或和 $s$,如果 $s = 0$,那么对于任意 $j \in [i + 1, k]$,都满足 $a = b$,即 $(i, j, k)$ 是一个满足条件的三元组,一共有 $k - i$ 个,我们将其累加到答案中即可。

枚举结束后,返回答案即可。

时间复杂度 $O(n^2)$,其中 $n$ 是数组 $\textit{arr}$ 的长度。空间复杂度 $O(1)$。

<!-- tabs:start -->

Expand All @@ -94,17 +100,13 @@ tags:
```python
class Solution:
def countTriplets(self, arr: List[int]) -> int:
n = len(arr)
pre = [0] * (n + 1)
for i in range(n):
pre[i + 1] = pre[i] ^ arr[i]
ans = 0
for i in range(n - 1):
for j in range(i + 1, n):
for k in range(j, n):
a, b = pre[j] ^ pre[i], pre[k + 1] ^ pre[j]
if a == b:
ans += 1
ans, n = 0, len(arr)
for i, x in enumerate(arr):
s = x
for k in range(i + 1, n):
s ^= arr[k]
if s == 0:
ans += k - i
return ans
```

Expand All @@ -113,20 +115,13 @@ class Solution:
```java
class Solution {
public int countTriplets(int[] arr) {
int n = arr.length;
int[] pre = new int[n + 1];
int ans = 0, n = arr.length;
for (int i = 0; i < n; ++i) {
pre[i + 1] = pre[i] ^ arr[i];
}
int ans = 0;
for (int i = 0; i < n - 1; ++i) {
for (int j = i + 1; j < n; ++j) {
for (int k = j; k < n; ++k) {
int a = pre[j] ^ pre[i];
int b = pre[k + 1] ^ pre[j];
if (a == b) {
++ans;
}
int s = arr[i];
for (int k = i + 1; k < n; ++k) {
s ^= arr[k];
if (s == 0) {
ans += k - i;
}
}
}
Expand All @@ -141,15 +136,13 @@ class Solution {
class Solution {
public:
int countTriplets(vector<int>& arr) {
int n = arr.size();
vector<int> pre(n + 1);
for (int i = 0; i < n; ++i) pre[i + 1] = pre[i] ^ arr[i];
int ans = 0;
for (int i = 0; i < n - 1; ++i) {
for (int j = i + 1; j < n; ++j) {
for (int k = j; k < n; ++k) {
int a = pre[j] ^ pre[i], b = pre[k + 1] ^ pre[j];
if (a == b) ++ans;
int ans = 0, n = arr.size();
for (int i = 0; i < n; ++i) {
int s = arr[i];
for (int k = i + 1; k < n; ++k) {
s ^= arr[k];
if (s == 0) {
ans += k - i;
}
}
}
Expand All @@ -161,24 +154,59 @@ public:
#### Go

```go
func countTriplets(arr []int) int {
n := len(arr)
pre := make([]int, n+1)
for i := 0; i < n; i++ {
pre[i+1] = pre[i] ^ arr[i]
}
ans := 0
for i := 0; i < n-1; i++ {
for j := i + 1; j < n; j++ {
for k := j; k < n; k++ {
a, b := pre[j]^pre[i], pre[k+1]^pre[j]
if a == b {
ans++
}
func countTriplets(arr []int) (ans int) {
for i, x := range arr {
s := x
for k := i + 1; k < len(arr); k++ {
s ^= arr[k]
if s == 0 {
ans += k - i
}
}
}
return ans
return
}
```

#### TypeScript

```ts
function countTriplets(arr: number[]): number {
const n = arr.length;
let ans = 0;
for (let i = 0; i < n; ++i) {
let s = arr[i];
for (let k = i + 1; k < n; ++k) {
s ^= arr[k];
if (s === 0) {
ans += k - i;
}
}
}
return ans;
}
```

#### Rust

```rust
impl Solution {
pub fn count_triplets(arr: Vec<i32>) -> i32 {
let mut ans = 0;
let n = arr.len();

for i in 0..n {
let mut s = arr[i];
for k in (i + 1)..n {
s ^= arr[k];
if s == 0 {
ans += (k - i) as i32;
}
}
}

ans
}
}
```

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,13 @@ tags:

<!-- solution:start -->

### Solution 1
### Solution 1: Enumeration

According to the problem description, to find triplets $(i, j, k)$ that satisfy $a = b$, which means $s = a \oplus b = 0$, we only need to enumerate the left endpoint $i$, and then calculate the prefix XOR sum $s$ of the interval $[i, k]$ with $k$ as the right endpoint. If $s = 0$, then for any $j \in [i + 1, k]$, the condition $a = b$ is satisfied, meaning $(i, j, k)$ is a valid triplet. There are $k - i$ such triplets, which we can add to our answer.

After the enumeration is complete, we return the answer.

The time complexity is $O(n^2)$, where $n$ is the length of the array $\textit{arr}$. The space complexity is $O(1)$.

<!-- tabs:start -->

Expand All @@ -76,17 +82,13 @@ tags:
```python
class Solution:
def countTriplets(self, arr: List[int]) -> int:
n = len(arr)
pre = [0] * (n + 1)
for i in range(n):
pre[i + 1] = pre[i] ^ arr[i]
ans = 0
for i in range(n - 1):
for j in range(i + 1, n):
for k in range(j, n):
a, b = pre[j] ^ pre[i], pre[k + 1] ^ pre[j]
if a == b:
ans += 1
ans, n = 0, len(arr)
for i, x in enumerate(arr):
s = x
for k in range(i + 1, n):
s ^= arr[k]
if s == 0:
ans += k - i
return ans
```

Expand All @@ -95,20 +97,13 @@ class Solution:
```java
class Solution {
public int countTriplets(int[] arr) {
int n = arr.length;
int[] pre = new int[n + 1];
int ans = 0, n = arr.length;
for (int i = 0; i < n; ++i) {
pre[i + 1] = pre[i] ^ arr[i];
}
int ans = 0;
for (int i = 0; i < n - 1; ++i) {
for (int j = i + 1; j < n; ++j) {
for (int k = j; k < n; ++k) {
int a = pre[j] ^ pre[i];
int b = pre[k + 1] ^ pre[j];
if (a == b) {
++ans;
}
int s = arr[i];
for (int k = i + 1; k < n; ++k) {
s ^= arr[k];
if (s == 0) {
ans += k - i;
}
}
}
Expand All @@ -123,15 +118,13 @@ class Solution {
class Solution {
public:
int countTriplets(vector<int>& arr) {
int n = arr.size();
vector<int> pre(n + 1);
for (int i = 0; i < n; ++i) pre[i + 1] = pre[i] ^ arr[i];
int ans = 0;
for (int i = 0; i < n - 1; ++i) {
for (int j = i + 1; j < n; ++j) {
for (int k = j; k < n; ++k) {
int a = pre[j] ^ pre[i], b = pre[k + 1] ^ pre[j];
if (a == b) ++ans;
int ans = 0, n = arr.size();
for (int i = 0; i < n; ++i) {
int s = arr[i];
for (int k = i + 1; k < n; ++k) {
s ^= arr[k];
if (s == 0) {
ans += k - i;
}
}
}
Expand All @@ -143,24 +136,59 @@ public:
#### Go

```go
func countTriplets(arr []int) int {
n := len(arr)
pre := make([]int, n+1)
for i := 0; i < n; i++ {
pre[i+1] = pre[i] ^ arr[i]
}
ans := 0
for i := 0; i < n-1; i++ {
for j := i + 1; j < n; j++ {
for k := j; k < n; k++ {
a, b := pre[j]^pre[i], pre[k+1]^pre[j]
if a == b {
ans++
}
func countTriplets(arr []int) (ans int) {
for i, x := range arr {
s := x
for k := i + 1; k < len(arr); k++ {
s ^= arr[k]
if s == 0 {
ans += k - i
}
}
}
return ans
return
}
```

#### TypeScript

```ts
function countTriplets(arr: number[]): number {
const n = arr.length;
let ans = 0;
for (let i = 0; i < n; ++i) {
let s = arr[i];
for (let k = i + 1; k < n; ++k) {
s ^= arr[k];
if (s === 0) {
ans += k - i;
}
}
}
return ans;
}
```

#### Rust

```rust
impl Solution {
pub fn count_triplets(arr: Vec<i32>) -> i32 {
let mut ans = 0;
let n = arr.len();

for i in 0..n {
let mut s = arr[i];
for k in (i + 1)..n {
s ^= arr[k];
if s == 0 {
ans += (k - i) as i32;
}
}
}

ans
}
}
```

Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
class Solution {
public:
int countTriplets(vector<int>& arr) {
int n = arr.size();
vector<int> pre(n + 1);
for (int i = 0; i < n; ++i) pre[i + 1] = pre[i] ^ arr[i];
int ans = 0;
for (int i = 0; i < n - 1; ++i) {
for (int j = i + 1; j < n; ++j) {
for (int k = j; k < n; ++k) {
int a = pre[j] ^ pre[i], b = pre[k + 1] ^ pre[j];
if (a == b) ++ans;
int ans = 0, n = arr.size();
for (int i = 0; i < n; ++i) {
int s = arr[i];
for (int k = i + 1; k < n; ++k) {
s ^= arr[k];
if (s == 0) {
ans += k - i;
}
}
}
return ans;
}
};
};
Original file line number Diff line number Diff line change
@@ -1,19 +1,12 @@
func countTriplets(arr []int) int {
n := len(arr)
pre := make([]int, n+1)
for i := 0; i < n; i++ {
pre[i+1] = pre[i] ^ arr[i]
}
ans := 0
for i := 0; i < n-1; i++ {
for j := i + 1; j < n; j++ {
for k := j; k < n; k++ {
a, b := pre[j]^pre[i], pre[k+1]^pre[j]
if a == b {
ans++
}
func countTriplets(arr []int) (ans int) {
for i, x := range arr {
s := x
for k := i + 1; k < len(arr); k++ {
s ^= arr[k]
if s == 0 {
ans += k - i
}
}
}
return ans
}
return
}
Loading
Loading