代码改变世界

找出N个数字中唯一出现奇数次的数 解题报告

2011-10-26 22:10  诸葛二牛  阅读(586)  评论(0编辑  收藏  举报

Description

现在有n个数,只有一个数出现奇数次,把它找出来。

Input

首先一个T表示有T组数据。
每组数据一个n表示有(n<=100000)个数。
接下来n个数字a0,a1……an-1( ai在int型范围内)。

Output

输出那个出现奇数次的数。

Sample Input

2
3
2 2 100000000
5
1 2 2 2 2

Sample Output

100000000
1

分析:由于数据量比较大,不适合建立大的hash表来统计数据。相反利用异或运算的性质,

1)可交换性 A XOR B XOR A = (A XOR A) XOR B

2) 奇数次异或结果为本身,偶数次异或结果为0。 A XOR A =0 , 0 XOR A =A

直接计算。

View Code
//2011-10-26
//AC
//在输入的数列中 找唯一出现奇数次的一个数。
//思路:利用^(XOR)运算的可交换性和 异或两次就为0,奇数此为它本身的性质
//不需要开额外的空间
#pragma once
#include<iostream>
using namespace std;
#include<string.h>
#include <time.h>

int main()
{
int n, a,b;;
while(cin>>n && n>0)
{
clock_t start=clock();
a=0;
for(int i=0;i<n;i++){
cin>>b;
a^=b;
}
cout<<a<<endl;
cout<<clock()-start<<endl;
}
return 0;
}