一、题目描述

二、解题思路
整体思路
画出决策树模拟解决这个问题,可以采用回溯法+全局变量的方法来解决这个问题。
具体思路
本题是子集问题的变式,决策树与leetcode 78 子集-CSDN博客一样;
(1)函数功能:dfs函数用于实现nums数组从start位置开始的所有子集的异或值;
(2)函数体:
<1>由于决策树从空集开始(空集也为子集),所以在一开始就更新返回值;
<2>i从start开始,当i越界时跳出循环;
<3>处理当前位置,将nums[i]与path异或,修改path的值;
<4>处理完当前位置后,dfs处理i+1位置的元素;
<5>回溯,**由位运算异或法则:a^a=0,0^a=a,**可知恢复现场时,只需要将path与nums[i]再异或即可;
三、代码实现
cpp
class Solution {
int sum;
int path;
public:
int subsetXORSum(vector<int>& nums) {
sum=0;path=0;
dfs(nums,0);
return sum;
}
void dfs(vector<int> nums,int start){
//更新结果
sum+=path;
for(int i=start;i<nums.size();i++){
path^=nums[i];
dfs(nums,i+1);
//恢复现场
path^=nums[i];
}
}
};