您的位置:首页 > 理论基础 > 计算机网络

2005. Lovely Number 很神奇的一道题 2010中山大学新手赛-网络预选赛

2014-01-22 23:56 281 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ sicily 位运算 struct