上周,在力扣周赛上第一题就卡了一会儿,要求列出所有子集(包括空集),对每个子集进行异或操作,再把异或和加起来得结果。
用笨办法搞了半天也算是过了,回头看人家大佬两分钟搞定,觉得事情并不简单,果然是有模板可用的。
模板–二进制枚举子集
先贴上代码:
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了半天。
以后的自己应该能看懂吧,懒得写了,搬砖去了。。
实在看不懂可以参考这一篇二进制枚举子集