【题目】:给定一个整数数组,数组中除了一个整数仅出现一次外,其他数字都是出现两次,采用时间可空间复杂度尽量小的方法找出这个仅出现一次的整数。
【来源】微软校招题
我最早知道这个题是在C语言的位操作学习过程中,这道题目是考察的对C或者C++位操作的应用--异或操作符 “^”,两个相同的整数(在计算机内表示是补码)进行异或操作,结果为0,数字0与任何整数异或操作,结果还是那个整数,利用这个性质,将数组中的整数异或操作,最终所有相同的数字都被异或操作结果为0,0与仅出现一次的数字异或,得到的还是那个数字。可以找到要求的数字。
【源代码】:
//******************************************************
// date : 2014-03-31
// author : zhangxiaoya
// university : BIT
//******************************************************
/**********************************************************
Instruction
输入一个整数数组,数组中除了一个整数仅出现一次外,
其他整数都出现两次,给出一种时间和空间复杂度最小的
方法找出这个只出现一次的整数
***********************************************************/
#include <iostream>
using namespace std;
int main()
{
int n,t,r;
while(cin>>n)
{
r =0;
while(n--)
{
cin>>t;
r ^=t;
}
cout<<r<<endl;
}
return 0;
}