1863. 找出所有子集的异或总和再求和
解题思路
1.求子集个数,可以知道子集总共有2^n个
2.0~2^n,对应的二进制个数,分别对应0和1,1代表数组此位生效,0不生效,依次来得到所有的子集
3.由题意可知,1 <= nums.length <= 12,所以2的平方,不会超过int最大值
4.如果二进制的长度小于nums.length,需要补全头部的0
解题遇到的问题
1.求子集个数,可以借助二进制
后续需要总结学习的知识点
1.解法1,需要后续优化

##解法1
class Solution {
public static void main(String[] args) {
System.out.println(subsetXORSum(new int[] {3,4,5,6,7,8}));
}
public static int subsetXORSum(int[] nums) {
// 求子集个数,可以知道子集总共有2^n个
// 0~2^n,对应的二进制个数,分别对应0和1,1代表数组此位生效,0不生效,依次来得到所有的子集
// 由题意可知,1 <= nums.length <= 12,所以2的平方,不会超过int最大值
int result = 0;
for (int i = 0; i < Math.pow(2, nums.length); i++) {
StringBuilder value = new StringBuilder(Integer.toBinaryString(i));
// 如果二进制的长度小于nums.length,需要补全头部的0
if (value.length() < nums.length) {
int size = nums.length - value.length();
for (int j = 0; j < size; j++) {
value.insert(0, '0');
}
}
int temp = 0;
for (int j = 0; j < value.length(); j++) {
if (value.charAt(j) == '1') {
temp ^= nums[j];
}
}
result += temp;
}
return result;
}
}
网友评论