题目
给你一个整数数组 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) 的数目。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-triplets-that-can-form-two-arrays-of-equal-xor/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
提示:
1 <= arr.length <= 300
1 <= arr[i] <= 10^8
思路
我觉得我对异或已经驾轻就熟了。果然刷题还是有用的。
利用前缀异或以及异或的性质迅速想好做法而且后面验证是没问题的。总之就还是异或的性质啦。思路写代码里惹。
答案
class Solution {
public:
int countTriplets(vector<int>& arr) {
//a==b,即arr[i]^arr[i+1]^……^arr[j]^……^arr[k]=0
//即arr[0]^……^arr[i-1]^(arr[0]^……^arr[i-1]^arr[i]^……^arr[k])=0
int len = arr.size();
int count=0;
//记录异或值
vector<int> sum(len,arr[0]);
for(int i=0;i<len-1;i++){
sum[i+1] = sum[i]^arr[i+1];
}
for(int i = 0;i<len-1;i++){
for(int k = i+1;k<len;k++){
if(i==0){
if(sum[k]==0) count = count+(k-i);
}
else if(sum[k]==sum[i-1]) count = count+(k-i);
}
}
return count;
}
};
问题
本来能很快写完,但是,我一直没有算出正确答案。
就是我在判断的时候,写了sum[k]^sum[i-1]==0,这真的是,惊天大问题。
这玩意是恒为真的。
编译器是Clion
详见此图。天呐,我想了半天硬是没想到优先级的问题www。