1 题目描述
2 知识点补充(异或运算)
还有一条结论,是这道题比较重要的一个结论,就是 a^b=a^c ->b=c
这个结论是可以说明的,我们记a^b=a^c=x,则有b=c=a^x
3 解题思路
回到本题,我们可以设计一个这样的数组
即
可以进一步化简为
所以题目中的a和b可以表示为
若a=b,那么
即
3-1 方法1 三重循环(循环i,j,k)
class Solution:
def countTriplets(self, arr: List[int]) -> int:
tmp=[0]
for i in range(len(arr)):
tmp.append(tmp[-1]^arr[i])
ret=0
for i in range(1,len(arr)):
for j in range(i+1,len(arr)+1):
for k in range(j,len(arr)+1):
if(tmp[i-1]==tmp[k]):
ret+=1
return(ret)
3-2 方法2 二重循环
当 Si=Sk+1的时候,[i+1,k]之间任意的j都是合理的,所以我们只需要枚举下标i和k就可以了
class Solution:
def countTriplets(self, arr: List[int]) -> int:
tmp=[0]
for i in range(len(arr)):
tmp.append(tmp[-1]^arr[i])
ret=0
for i in range(1,len(arr)):
for j in range(i+1,len(arr)+1):
#for k in range(j,len(arr)+1):
if(tmp[i-1]==tmp[j]):
ret+=j-i
return(ret)
3-3 方法3 一重循环
更简化的是,我们在构建数组S的时候,就可以计算次数了,这样两个循环又并成了一个循环