题目
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][1,10^4][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)N (≤10^5)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
解题思路
题目大意: 给你10410^4104个数,如果存在多个重复的数,找到其中第一个重复的数,如果不存在,输出None。
解题思路: 数据范围不是很大,直接用结构体数组作为hash表,记录出现的次数和第一次出现的位置,最后循环判定即可,时间复杂度O(n)O(n)O(n),空间复杂度O(n)O(n)O(n)。
/*
** @Brief:No.1041 of PAT advanced level.
** @Author:Jason.Lee
** @Date:2018-12-17
** @status: Accepted!
*/
#include<iostream>
#define INF 999999
#define MAX 100001
using namespace std;
struct bets{
int times;
int first;
};
bets b[MAX];
int main(){
int N;
while(cin>>N){
bets init{0,INF};
fill(b,b+MAX,init);
for(int i=0;i<N;i++){
int temp;
cin>>temp;
b[temp].times++;
if(b[temp].first==INF){
b[temp].first = i;
}
}
int min = INF;
int pos = -1;
for(int i=0;i<MAX;i++){
if(b[i].times==1&&b[i].first<min){
min = b[i].first;
pos = i;
}
}
if(pos==-1){
cout<<"None"<<endl;
}else{
cout<<pos<<endl;
}
}
return 0;
}
总结
以空间换时间,毕竟内存在降价,时间却逝者如斯,所以时间更宝贵。这道题还可以用std::map
来做,代码会更简短,但是时间会有所上升,具体代码如下——
/*
** @Brief:No.1041 of PAT advanced level.
** @Author:Jason.Lee
** @Date:2018-12-17
** @status: Accepted!
*/
#include<iostream>
#include<vector>
#include<map>
using namespace std;
int main(){
int N;
while(cin>>N){
vector<int> index(N);
map<int,int> bets;
for(int i=0;i<N;i++){
cin>>index[i];
bets[index[i]]++;
}
int flag = 0;
for(int i=0;i<N;i++){
if(bets[index[i]]==1){
flag = index[i];
break;
}
}
if(flag!=0){
cout<<flag<<endl;
}else{
cout<<"None"<<endl;
}
}
return 0;
}