[子集问题] 找出所有子集的异或总和再求和

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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值