1041 Be Unique(20 分)
Being unique is so important to people on Mars that even their lottery is designed in a unique way. The rule of winning is simple: one bets on a number chosen from [1,104]. The first one who bets on a unique number wins. For example, if there are 7 people betting on { 5 31 5 88 67 88 17 }, then the second one who bets on 31 wins.
Input Specification:
Each input file contains one test case. Each case contains a line which begins with a positive integer N (≤105) and then followed by N bets. The numbers are separated by a space.
Output Specification:
For each test case, print the winning number in a line. If there is no winner, print None
instead.
Sample Input 1:
7 5 31 5 88 67 88 17
Sample Output 1:
31
Sample Input 2:
5 888 666 666 888 888
Sample Output 2:
None
题目要求:
输入N个数,找到第一个在所有数中只出现一次的那个数
解题思路:
由于数的数量很大,查找则非常耗时。这题运用散列的思想,用牺牲空间的办法来节约时间。用数组a[i]存放按顺序依次出现的值,用数组sign[m]记录数字i出现的次数,第一次是1,第二次2。这样遍历数组a找到第一个sign[m]=1的数m。
完整代码:
#include<bits/stdc++.h>
using namespace std;
int sign[100001];
int a[100001];
int main(){
int i,N,m;
int num=0;
memset(sign,0,sizeof(sign));
cin>>N;
for(i=0;i<N;i++){
scanf("%d",&m);
if(sign[m]==0){
a[num++] = m;
}
sign[m]++;
}
for(i=0;i<num;i++){
m = a[i];
if(sign[m] == 1){
cout<<m;
break;
}
}
if(i==num){
cout<<"None";
}
return 0;
}