1.根据异或符号^的性质来说,异或就是对称差运算,即AUB-A交B 所以有A^0==A,A^A=0. 根据这个性质,定义一个初值为0的一个变量,对整个数组的下标(为了得到一个全集)进行遍历一次,那么非重复的数据会全部存在一个集合里/ 2.然后用这个全集再对这个数组进行遍历,消去重复的,最后只会剩下那个出现两次的数据/
标题若是可以开辟空间,可以用数组嵌套,将第一个数组的值当作第二个数组的下标,出现一次就加1,最后判断值为2的数组下标是谁即可。
标题求数据元素的子集&求的是二进制对应位数的一个交集,也可以用来求二进制1的个数,用一个变量统计即可。
1.&相当于交 根据2进制,开辟相对应的数组与1<<i比较,看他元素的大小,注意这里子集元素不能重复,有重复的需要去重
using namespace std;
void solve(int n, int s)
{
for (int i = 0; i < n; i++)
{
if (s == 0)
{
cout << "0";
break;
}
if (s & (1 << i))
cout << i+1 << " ";
}
cout << endl;
}
int main()
{
int n;
cin >> n;
for (int i = 0; i <(1<<n) ; i++)
{
solve(n,i);
}
return 0;
}*/