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 }

 

你可能感兴趣的:(OJ)