1442. 形成两个异或相等数组的三元组数目
给你一个整数数组 arr 。
现需要从数组中取三个下标 i、j 和 k ,其中 (0 <= i < j <= k < arr.length) 。
a 和 b 定义如下:
a = arr[i] ^ arr[i + 1] ^ … ^ arr[j - 1]
b = arr[j] ^ arr[j + 1] ^ … ^ arr[k]
注意:^ 表示 按位异或 操作。
请返回能够令 a == b 成立的三元组 (i, j , k) 的数目。
前缀和,将前缀求出,那么a^b就简单了很多
我自己想的方法没有看出这道题后面的规律,三层循环,费时间了
class Solution {
public int countTriplets(int[] arr) {
int n=arr.length;
int cnt=0;
int []pre=new int[n+1];
for(int i=1;i<=n;i++)
pre[i]=pre[i-1]^arr[i-1];
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
for(int k=j;k<n;k++){
if((pre[i]^pre[j])==(pre[j]^pre[k+1]))
cnt++;
}
}
}
return cnt;
}
`
看了解析,发现如果ab 等价于a^b0这样就更简单了
附上解析的代码
class Solution:
def countTriplets(self, arr: List[int]) -> int:
if len(arr)<2:
return 0
ans=0
for i in range(len(arr)):
temp=arr[i]
for j in range(i+1,len(arr)):
temp=temp^arr[j]
if temp==0:
ans+=j-i
return ans