问题背景
一个数组的 异或总和 定义为数组中所有元素按位 X O R XOR XOR 的结果;如果数组为 空 ,则异或总和为 0 0 0。
例如,数组 [ 2 , 5 , 6 ] [2,5,6] [2,5,6]的 异或总和 为 2 X O R 5 X O R 6 = 1 2 \ XOR \ 5 \ XOR \ 6 = 1 2 XOR 5 XOR 6=1。
给你一个数组 n u m s nums nums,请你求出 n u m s nums nums 中每个 子集 的 异或总和 ,计算并返回这些值相加之 和 。
注意:在本题中,元素 相同 的不同子集应 多次 计数。
数组 a a a 是数组 b b b 的一个 子集 的前提条件是:从 b b b 删除几个(也可能不删除)元素能够得到 a a a。
数据约束
- 1 ≤ n u m s . l e n g t h ≤ 12 1 \le nums.length \le 12 1≤nums.length≤12
- 1 ≤ n u m s [ i ] ≤ 20 1 \le nums[i] \le 20 1≤nums[i]≤20
解题过程
子集先异或再求和的结果,等于数组中所有元素的或和 o r S u m orSum orSum 与 2 n − 1 2 ^ {n - 1} 2n−1 的乘积。
证明比较复杂,参考 灵神的题解。
具体实现
class Solution {public int subsetXORSum(int[] nums) {int orSum = 0;for (int num : nums) {orSum |= num;}return orSum << (nums.length - 1);}
}