2005. Lovely Number
Constraints
Time Limit: 1 secs, Memory Limit: 64 MB
Description
Every time after got a solution from kevin, ivan repeats again and again,"Are there any better ones?". It seems more worse this time. Given a sequence of numbers, which ivan is sure that all of them appear even times except only one "lovely number" appears odd times, kevin must find out the lovely number as soon as possible. So, let's rock!
Input
There are multiple test cases.
Each test case contains two lines. The first line is an integer N, 1 <= N <= 10001, and N % 2 = 1. The second line contains N integers, separated by spaces.
Input is terminated by EOF.
Output
For each test case, output a line of an integer, which should be the lovely number.
Sample Input
31 2 157 7 7 7 372 2 4 4 4 2 2
Sample Output
234
Problem Source
2010中山大学新手赛-网络预选赛 ivankevin@argo
好吧 这道题的解法实在太多了
解法一:
我的代码 struct(最长的……哭):Run Time:0.12sec Run Memory:392 KB
#include <iostream>
using namespace std;
struct num {
int number;
int time;
}num[10005];
int main () {
int n;
while (cin>>n && n) {
//for(int i = 0; i < 10002; i++) { //这里是初始化 可以有可以没有
// num[i].number = 0;
// num[i].time = 0;
//}
int temp;
cin>>temp;
num[1].number = temp;
num[1].time = 1;
int j = 1; //记录已经录入的数字数目
for (int i = 2; i <= n; i++) {
bool flag = false; //这货的位置坑了我很久!!!
cin>>temp;
for (int k = 1; k <= j; k++) {
if(num[k].number == temp) {
num[k].time += 1;
flag = true;
break;
}
}
if (flag == false) {
j++;
num[j].number = temp;
num[j].time = 1;
}
}
for (int k = 1; k <= j; k++) {
if (num[k].time % 2 == 1)
cout<<num[k].number<<endl;
}
}
//system("pause");
return 0;
}
解法2:
位运算
异或
链接:http://163yescpk.blog.163.com/blog/static/1418902882010111310433304/
代码:Run Time: 0.02secs Run Memory: 312KB
#include <iostream>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
int ans = 0;
for (int i = 0 ; i < n ; ++i)
{
int x;
cin >> x;
ans ^= x;
}
cout << ans << "\n";
}
return 0;
}
解法3:
set
链接:http://blog.csdn.net/luojiayu14/article/details/7098665
代码:Run Time: 0.04secs Run Memory: 312KB
#include <iostream>
#include <set>
using namespace std;
int main()
{
int t;
while(cin>>t)
{
int temp;
set<int>myset;
while(t--)
{
cin>>temp;
if(myset.count(temp))
myset.erase(temp);
else
myset.insert(temp);
}
cout<<*myset.begin()<<endl;
}
return 0;
}
解法4:
map
链接:http://blog.csdn.net/ederick/article/details/7246270
代码:Run Time: 0.02secs Run Memory: 436KB
#include <cstdio>
#include <map>
using namespace std;
int main()
{
int N, i;
int temp;
map<int, int>::iterator it;
while ( scanf( "%d", &N ) != EOF ) {
map<int, int> data;
for ( i = 0; i < N; i++ ) {
scanf( "%d", &temp );
data.find( temp ) != data.end() ? data[ temp ]++: data[ temp ] = 1;
}
for ( it = data.begin(); it != data.end(); it++ ) {
if ( it->second % 2 == 1 ) {
printf( "%d\n", it->first );
break;
}
}
}
return 0;
}
解法5:
数组only
但是空间很大(题目给的也很大所以不用担心)以空间换时间
链接:http://www.cnblogs.com/lvye/archive/2011/03/25/1995810.html
代码:Run Time: 0.04secs Run Memory: 4220KB
#include<iostream>
#include<stdlib.h>
#include<cstring>
using namespace std;
int num[1000001];
int main()
{
int n,i,m;
while(cin>>n)
{
memset(num,0,sizeof(num));
for(i=0;i<n;i++)
{
cin>>m;
num[m]++;
}
for(i=0;i<1000001;i++)
if(num[i]%2==1)
{
cout<<i<<endl;
break;
}
}
return 0;
}