leetcode 1422 形成两个异或相等数组的三元组数目

package com.example.lettcode.bits;

/**
 * @Class CountTriplets
 * @Description 1422 形成两个异或相等数组的三元组数目
 * 给你一个整数数组 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) 的数目。
 * 示例 1:
 * 输入:arr = [2,3,1,6,7]
 * 解释:满足题意的三元组分别是 (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
 * 示例 4:
 * 输入:arr = [1,3,5,7,9]
 * 输出:3
 * 示例 5:
 * 输入:arr = [7,11,12,9,5,2,7,17,22]
 * 输出:8
 * @Author
 * @Date 2021/5/18
 **/
public class CountTriplets {
    /**
     * 暴力求解,恐怕会越界,竟然没有,这。。。。
     *
     * @param arr
     * @return
     */
    public static int countTriplets01(int[] arr) {
        if (arr == null || arr.length == 1) return 0;

        int lenth = arr.length;
        int[][] tmp = new int[lenth][lenth];
        for (int i = 0; i < lenth; i++) {
            tmp[i][i] = arr[i];
            for (int k = i + 1; k < lenth; k++) {
                for (int j = i; j <= k; j++) {
                    tmp[i][k] ^= arr[j];
                }
            }
        }

        int count = 0;
        for (int i = 0; i < lenth - 1; i++) {
            for (int k = i + 1; k < lenth; k++) {
                for (int j = i + 1; j <= k; j++) {
                    if (tmp[i][j - 1] == tmp[j][k]) {
                        count++;
                    }
                }
            }
        }
        return count;
    }

    /**
     * 利用前缀异或
     *
     * @param arr
     * @return
     */
    public static int countTriplets(int[] arr) {
        if (arr == null || arr.length == 1) return 0;

        int lenth = arr.length;
        int[] sum = new int[lenth + 1];
        for (int i = 1; i <= lenth; i++) sum[i] = sum[i - 1] ^ arr[i - 1];

        int count = 0;
        for (int i = 1; i <= lenth; i++) {
            for (int j = i + 1; j <= lenth; j++) {
                for (int k = j; k <= lenth; k++) {
                    // a = arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]
                    int a = sum[i - 1] ^ sum[j - 1];
                    // b = arr[j] ^ arr[j + 1] ^ ... ^ arr[k]
                    int b = sum[k] ^ sum[j - 1];
                    if (a == b) count++;
                }
            }
        }

        return count;
    }
}
// 测试用例
public static void main(String[] args) {
	int[] arr = new int[]{2, 3, 1, 6, 7};
	int ans = CountTriplets.countTriplets(arr);
	System.out.println("CountTriplets demo01 result : " + ans);

	arr = new int[]{1, 1, 1, 1, 1};
	ans = CountTriplets.countTriplets(arr);
	System.out.println("CountTriplets demo02 result : " + ans);

	arr = new int[]{2, 3};
	ans = CountTriplets.countTriplets(arr);
	System.out.println("CountTriplets demo03 result : " + ans);

	arr = new int[]{1, 3, 5, 7, 9};
	ans = CountTriplets.countTriplets(arr);
	System.out.println("CountTriplets demo04 result : " + ans);

	arr = new int[]{7, 11, 12, 9, 5, 2, 7, 17, 22};
	ans = CountTriplets.countTriplets(arr);
	System.out.println("CountTriplets demo05 result : " + ans);

}
posted @ 2021-05-18 11:46  枫叶艾辰  阅读(61)  评论(0编辑  收藏  举报