zoukankan      html  css  js  c++  java
  • 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);
    
    }
    
  • 相关阅读:
    c#中ref与out区别
    【转载】Firebug中net面板的使用
    结构声明、定义
    开始旅程了
    strcpy、strcat、strcmp、strlen
    #include 格式
    宏定义
    MySQL 字段类型
    MySQL 约束类型
    (转载)C#语言之“string格式的日期时间字符串转为DateTime类型”的方法
  • 原文地址:https://www.cnblogs.com/fyusac/p/14780315.html
Copyright © 2011-2022 走看看