一个数组的 异或总和 定义为数组中所有元素按位 XOR 的结果;如果数组为 空 ,则异或总和为 0 。
例如,数组 [2,5,6] 的 异或总和 为 2 XOR 5 XOR 6 = 1 。 给你一个数组 nums ,请你求出 nums 中每个
子集 的 异或总和 ,计算并返回这些值相加之 和 。注意:在本题中,元素 相同 的不同子集应 多次 计数。
数组 a 是数组 b 的一个 子集 的前提条件是:从 b 删除几个(也可能不删除)元素能够得到 a 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-all-subset-xor-totals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
`c
示例 1:
输入:nums = [1,3] 输出:6 解释:[1,3] 共有 4 个子集:
- 空子集的异或总和是 0 。
- [1] 的异或总和为 1 。
- [3] 的异或总和为 3 。
- [1,3] 的异或总和为 1 XOR 3 = 2 。 0 + 1 + 3 + 2 = 6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-all-subset-xor-totals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本题乍一看没有思路,后面会发现还是有规律的
比如1 3 5
1开头 【1 】【1 3 】【1 5】【1 3 5】
3开头【3】【3 5】
5开头【5】
然后将这些异或的结果相加即可(使用一个全局变量存储结果)
这里使用了dfs算法(深度优先搜索算法)
对数组的每一位进行dfs求解,即是对每一个开头的数字进行处理。
当temp(i+1)的值等于数组长度时(最后一位完成运算),将这组的结果加入res
class Solution {
int res=0;
public int subsetXORSum(int[] nums) {
for (int i = 0; i < nums.length; i++) {
dfs(i+1,nums[i],nums);
}
return res;
}
public void dfs(int temp, int sum, int[] nums){
if(temp==nums.length){
res+=sum;
}else {
dfs(temp+1,sum,nums);//不包含当前位置的数
dfs(temp+1,sum^nums[temp],nums);//包含当前位置的数
}
}
}