1、描述
给一个数组arr,让从中间选取3个下标,0<= i < j <=k <n。使得n1= arr[i]^…arr[j-1],和n2 =arr[j]^…arr[k]相等,求出能使相等的总个数。
2、关键字
数组,异或,相等。区间,i不必从零开始
3、思路
先把数组分开成两段。左边一段从右往左遍历寻找。右边一段从左往右寻找。3层循环。
4、notes
i,是一个范围,不是非得从零开始。
暂存结果的n1,和n2,需要每次当前循环重置为0,所以要在外一层循环中声明。
5、复杂度
时间O(n3次方)
空间:O(1)
6、code
class Solution {
public:
int countTriplets(vector<int>& arr) {
int n = arr.size();
//int n1 = 0;
int res = 0;
vector<int>nums;
for (int i = 1; i < n; i++){
int n1 = 0; // 从这里开始定义为0,免得以后都有记录,影响后面的统计结果,
for(int j = i-1; j >= 0;j--){ // 从选中的当前值,往左搜索,
n1 ^=arr[j];
int n2 = 0;
for(int k=i; k < n;k++){ // 从选中的当前值往右搜索,
n2 ^=arr[k];
if(n1 == n2){ // 统计结果
res++;
}
}
}
}
return res;
}
};