原题链接:1863. 找出所有子集的异或总和再求和
最初想法就是枚举子集,但是不知道如何处理,看完题解之后豁然开朗。
对于一个有
n
n
n个元素的集合,它的子集个数为
2
n
2^{n}
2n,于是可以把一个集合的子集映射到
[
0
,
2
n
−
1
]
[0,2^{n}-1]
[0,2n−1],将每一个数表示成二进制数,则每一位上的
0
0
0和
1
1
1表示当前元素是否选择,因而可以表示出所有子集的情况。
接下来就是如何获取每一个子集中元素的选取情况, 直接遍历
n
n
n位数的每一位,如果当前位上是
0
0
0,则说明当前元素在当前子集未被选中,关键判断代码if i & (1 << j):
完整代码:
class Solution:
def subsetXORSum(self, nums: List[int]) -> int:
size = len(nums)
result = 0
for i in range(1<<size):
res = 0
for j in range(size):
if i & (1<<j):
res ^= nums[j]
result += res
return result