NYOJ 528 找球号(三)

 1 #include<stdio.h>
 2 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 #include<iostream>
 2 #include<set>
 3 using namespace std;
 4 int main()
 5 {
 6     int i,n;
 7     set<int>s;
 8     while(cin>>n){
 9         while(n--){
10             cin>>i;
11             if(s.find(i)==s.end())
12                 s.insert(i);
13             else
14                 s.erase(i);
15         }
16         cout<<*s.begin()<<endl;
17         s.clear();
18     }
19     return 0;    
20 }
原文地址:https://www.cnblogs.com/shihuajie/p/2973749.html