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

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值