【用二进制方法枚举数组所有的子集】

上周,在力扣周赛上第一题就卡了一会儿,要求列出所有子集(包括空集),对每个子集进行异或操作,再把异或和加起来得结果。
用笨办法搞了半天也算是过了,回头看人家大佬两分钟搞定,觉得事情并不简单,果然是有模板可用的。
模板–二进制枚举子集
先贴上代码:

class Solution {
public:
    int subsetXORSum(vector<int>& nums) {
        //子集一共有2^n个组合==1<<n
        int n = nums.size();
        int ans = 0;
        for(int i = 0; i < (1<<n); i++){
            //res = 每个子集异或组合的结果
            int res = 0;
            for(int j = 0; j < n; j++){
                //扫描数组,看第j位是否取1
                if(i & (1<<j)){
                    res ^= nums[j];
                }
            }
            ans += res;
        }
        return ans;
    }
};

惊喜的发现里面有自己以前刷过题的影子,就是那个骚操作i&(1<<j),前面有篇博客记录了这玩意儿是干啥的,就是判断第j位是不是1,终于在这儿用上了,然而我一开始还没认出来,qiu了半天。
以后的自己应该能看懂吧,懒得写了,搬砖去了。。

实在看不懂可以参考这一篇二进制枚举子集

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值