type
status
date
slug
summary
tags
category
icon
password
创建时间
Jan 24, 2025 04:28 AM
给你一个整数数组
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
) 的数目。位运算——异或
推导
根据题意,有
a = arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]
、b = arr[j] ^ arr[j + 1] ^ ... ^ arr[k]
,而题目让我们计算请够满足 a == b
成立的三元组 (i
, j
, k
) 的数目。也就是 arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]=== arr[j] ^ arr[j + 1] ^ ... ^ arr[k]]
为了快速求任意区间的异或和,我们一般采用异或前缀和的形式。异或和的形式是
因此,、,则 。
三次循环
两次循环
我们通过推导,得到 ,发现与 无关。也就是只要 ,中间的所有 都满足,对应的个数是 。
一次循环——哈希表
参考力扣官方题解
对于下标 ,若下标 都满足 ,则有
因此,借助两个哈希表来做到,在遍历下标 的同时,一个哈希表统计 的出现次数,另一个哈希表统计值为 的下标之和。
过程中计算前缀和