1 #include2 int main() 3 { 4 int i,res,n; 5 while(~scanf("%d",&n)){ 6 res=0; 7 while(n--){ 8 scanf("%d",&i); 9 res^=i;10 }11 printf("%d\n",res);12 }13 return 0;14 }
我们先了解一下位异或的运算法则吧:
1、a^b = b^a。
2、(a^b)^c = a^(b^c)。
3、a^b^a = b。
对于一个任意一个数n,它有几个特殊的性质:
1、0^n = n。
2、n^n = 0。
所以可以通过每次异或运算,最后剩下的值就是出现奇数次的那个数字。
还可以用STL中的set容器,不过好像没有上面的效率高,贴上代码:
1 #include2 #include 3 using namespace std; 4 int main() 5 { 6 int i,n; 7 set s; 8 while(cin>>n){ 9 while(n--){10 cin>>i;11 if(s.find(i)==s.end())12 s.insert(i);13 else14 s.erase(i);15 }16 cout<<*s.begin()<