数据结构和算法分析数据结构与算法

Leetcode-1863 找出所有子集的异或总和再求和

2021-11-19  本文已影响0人  itbird01

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,需要后续优化


image.png
##解法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;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读