1442. 形成两个异或相等数组的三元组数目

1442. 形成两个异或相等数组的三元组数目

给你一个整数数组 arr

现需要从数组中取三个下标 ijk ,其中 (0 <= i < j <= k < arr.length)

ab 定义如下:

  • a = arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]
  • b = arr[j] ^ arr[j + 1] ^ ... ^ arr[k]

注意:^ 表示 按位异或 操作。

请返回能够令 a == b 成立的三元组 (i, j , k) 的数目。

力扣链接:https://leetcode-cn.com/problems/count-triplets-that-can-form-two-arrays-of-equal-xor

示例 1:

输入:arr = [2,3,1,6,7]
输出:4
解释:满足题意的三元组分别是 (0,1,2), (0,2,2), (2,3,4) 以及 (2,4,4)

示例 2:

输入:arr = [1,1,1,1,1]
输出:10

示例 3:

输入:arr = [2,3]
输出:0

/*
	方法一:不假思索的暴力循环。没什么好说的,也没什么好看的。

*/
class Solution {
    public int countTriplets(int[] arr) {
        int res=0;
        int n1,n2;
        for(int i =0;i<arr.length;i++){
            for(int j=i+1;j<arr.length;j++){
                for(int k=j;k<arr.length;k++){
                    n1 = arr[i];
                    int ii = i + 1;
                    while(ii<j){
                        n1 = n1^arr[ii];
                        ii++;
                    }
                    n2 = arr[j];
                    int jj = j+1;
                    while(jj<=k){
                        n2 = n2 ^ arr[jj];
                        jj++;
                    }
                    if(n1 == n2){
                        res++;
                    }
                }
            }
        }
        return res;
    }
}
/*
	方法二:
	思路: 当a==b时,a^b=0即 arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]^arr[j] ^ arr[j + 1] ^ ... ^ arr[k] = 0; 在满足上述条件的i和k之间任意取一个j,这个j的左右异或值都是相等的。

*/
class Solution {
    public int countTriplets(int[] arr) {
        int len = arr.length;
        int res = 0;
        
        for(int i = 0; i < len - 1; i ++){
            int sum = 0;
            for(int k = i; k < len ; k ++){
                sum ^= arr[k];
                if (sum == 0 && k > i) {
                    res += (k - i);
                }
            }
        }
        return res;
    }
}

总结:两个值(i,k)之间的所有数的异或值等于0,则中间任意一个数的左右两边的异或值相等[i,j)==[j,k]。

posted @ 2021-05-22 09:36  Manan_vision  阅读(90)  评论(0)    收藏  举报