Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/1863.html
1863. Sum of All Subset XOR Totals
Level
Easy
Description
The XOR total of an array is defined as the bitwise XOR
of all its elements, or 0
if the array is empty.
- For example, the XOR total of the array
[2,5,6]
is2 XOR 5 XOR 6 = 1
.
Given an array nums
, return the sum of all XOR totals for every subset of nums
.
Note: Subsets with the same elements should be counted multiple times.
An array a
is a subset of an array b
if a
can be obtained from b
by deleting some (possibly zero) elements of b
.
Example 1:
Input: nums = [1,3]
Output: 6
Explanation: The 4 subsets of [1,3] are:
- The empty subset has an XOR total of 0.
- [1] has an XOR total of 1.
- [3] has an XOR total of 3.
- [1,3] has an XOR total of 1 XOR 3 = 2.
0 + 1 + 3 + 2 = 6
Example 2:
Input: nums = [5,1,6]
Output: 28
Explanation: The 8 subsets of [5,1,6] are:
- The empty subset has an XOR total of 0.
- [5] has an XOR total of 5.
- [1] has an XOR total of 1.
- [6] has an XOR total of 6.
- [5,1] has an XOR total of 5 XOR 1 = 4.
- [5,6] has an XOR total of 5 XOR 6 = 3.
- [1,6] has an XOR total of 1 XOR 6 = 7.
- [5,1,6] has an XOR total of 5 XOR 1 XOR 6 = 2.
0 + 5 + 1 + 6 + 4 + 3 + 7 + 2 = 28
Example 3:
Input: nums = [3,4,5,6,7,8]
Output: 480
Explanation: The sum of all XOR totals for every subset is 480.
Constraints:
1 <= nums.length <= 12
1 <= nums[i] <= 20
Solution
Enumerate all subsets of nums
. For each subset, calculate the XOR total. Finally, calculate the sum of all subsets’ XOR totals and return.
-
class Solution { public int subsetXORSum(int[] nums) { int sum = 0; int length = nums.length; int count = 1 << length; for (int i = 0; i < count; i++) { int xor = getXor(nums, i); sum += xor; } return sum; } public int getXor(int[] nums, int curNum) { int xor = 0; int index = 0; while (curNum > 0) { int remainder = curNum % 2; if (remainder == 1) xor ^= nums[index]; curNum >>= 1; index++; } return xor; } } ############ class Solution { private int res; public int subsetXORSum(int[] nums) { dfs(nums, 0, 0); return res; } private void dfs(int[] nums, int depth, int prev) { res += prev; for (int i = depth; i < nums.length; ++i) { prev ^= nums[i]; dfs(nums, ++depth, prev); prev ^= nums[i]; } } }
-
// OJ: https://leetcode.com/problems/sum-of-all-subset-xor-totals/ // Time: O(2^N) // Space: O(N) class Solution { int ans = 0; void dfs(vector<int> &A, int start, int val) { if (start == A.size()) { ans += val; return; } dfs(A, start + 1, val ^ A[start]); dfs(A, start + 1, val); } public: int subsetXORSum(vector<int>& A) { dfs(A, 0, 0); return ans; } };
-
class Solution: def subsetXORSum(self, nums: List[int]) -> int: def dfs(nums, depth, prev): self.res += prev for num in nums[depth:]: prev ^= num depth += 1 dfs(nums, depth, prev) prev ^= num self.res = 0 dfs(nums, 0, 0) return self.res ############ # 1863. Sum of All Subset XOR Totals # https://leetcode.com/problems/sum-of-all-subset-xor-totals/ class Solution: def subsetXORSum(self, nums: List[int]) -> int: n = len(nums) res = 0 for i in range(1 << n): t = 0 for j in range(n): if i >> j & 1: t ^= nums[j] res += t return res
-
/** * @param {number[]} nums * @return {number} */ var subsetXORSum = function (nums) { let res = []; let prev = 0; dfs(nums, 0, prev, res); return res.reduce((a, c) => a + c, 0); }; function dfs(nums, depth, prev, res) { res.push(prev); for (let i = depth; i < nums.length; i++) { prev ^= nums[i]; depth++; dfs(nums, depth, prev, res); // bracktrack prev ^= nums[i]; } }
-
func subsetXORSum(nums []int) (ans int) { n := len(nums) var dfs func(int, int) dfs = func(i, s int) { if i >= n { ans += s return } dfs(i+1, s) dfs(i+1, s^nums[i]) } dfs(0, 0) return }
-
function subsetXORSum(nums: number[]): number { let ans = 0; const n = nums.length; const dfs = (i: number, s: number) => { if (i >= n) { ans += s; return; } dfs(i + 1, s); dfs(i + 1, s ^ nums[i]); }; dfs(0, 0); return ans; }