[子集问题] 找出所有子集的异或总和再求和
1863. 找出所有子集的异或总和再求和 - 力扣(LeetCode)
一个数组的 异或总和 定义为数组中所有元素按位 XOR
的结果;如果数组为 空 ,则异或总和为 0
。
- 例如,数组
[2,5,6]
的 异或总和 为2 XOR 5 XOR 6 = 1
。
给你一个数组 nums
,请你求出 nums
中每个 子集 的 异或总和 ,计算并返回这些值相加之 和 。
思路:
1.先找出元素所有子集
2.遍历每个子集,求出异或和,汇总
class Solution {
public:
int subsetXORSum(vector<int>& nums) {
int n=nums.size();
int probNum=1<<n;
vector<vector<int>>subsets;
for(int i=0;i<probNum;i++){
vector<int>item;
for(int j=0;j<n;j++){
//当前j元素被包含在生成的子集中
if(i&(1<<j)){
item.push_back(nums[j]);
}
}
subsets.push_back(item);
}
int res=0;
//遍历子集,求异或和
for(auto item:subsets){
//如果子集大小为1,异或和为它本身
if(item.size()==1)
res+=item[0];
else if(item.size()>1){
int tmp=item[0];
for(int i=1;i<item.size();i++)
tmp=tmp^item[i];
res+=tmp;
}
}
return res;
}
};