leetcode每日不做题
461. 汉明距离
852. 山脉数组的峰顶索引
374. 猜数字大小
278. 第一个错误的版本
474. 一和零
231. 2 的幂
342. 4的幂
1074. 元素和为目标值的子矩阵数量
477. 汉明距离总和
12. 整数转罗马数字
1190. 反转每对括号间的子串
692. 前K个高频单词
1738. 找出第 K 大的异或坐标值
1442. 形成两个异或相等数组的三元组数目
993. 二叉树的堂兄弟节点
421. 数组中两个数的最大异或值
13.罗马数字转整数
本文档使用 MrDoc 发布
-
+
首页
1442. 形成两个异或相等数组的三元组数目
[力扣原题链接](https://leetcode-cn.com/problems/count-triplets-that-can-form-two-arrays-of-equal-xor/) ## 题目 给你一个整数数组 `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] 输出: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 ``` **示例 4:** ``` 输入:arr = [1,3,5,7,9] 输出:3 ``` **示例 5:** ``` 输入:arr = [7,11,12,9,5,2,7,17,22] 输出:8 ``` **提示:** * `1 <= arr.length <= 300` * `1 <= arr[i] <= 10^8` ## 思路 `a=b` 等价于`a^b=0` 由于k>=j,也就是k有等于j的情况,因此对数组循环计算`arr[i]^arr[i+1]^..^arr[j]=0`时就能得出`k=j`时`a=b`的情况,这种情况下还有一种规律,在`(i,j)`区间`a^b=0`成立时,会有`(j-i)`种组合使得`a^b=0`也成立(别问,问就是看提示猜测的,猜对了)。所以只要计算出`arr[i]^arr[i+1]^..^arr[j]=0(i从0开始,j从i+1开始)`时`i`,`j`的值,然后相减,最后进行累加就能得到最终结果 ## 代码 语言:Java ``` class Solution { public int countTriplets(int[] arr) { int result = 0; int xorResult = 0; // a = b等价于a^b=0 // 循环计算arr[i]^arr[i+1]^... = 0 for (int i = 0; i < arr.length; i++) { xorResult = arr[i]; for (int j = i + 1; j < arr.length; j++) { xorResult ^= arr[j]; if(xorResult == 0){ // 有个规律,在(i,j)区间a^b=0成立时,会有(j-i)种组合 // 别问为啥,问就是根据提示猜的 result += j - i; } } } return result; } } ```
renyi567
2021年5月18日 13:22
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
阅读量
次
本站总访问量
次
本站访客数
人次
Markdown文件
分享
链接
类型
密码
更新密码