题目来源:PAT (Advanced Level) Practice
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
words:
unique 唯一的,独一无二的 lottery 彩票 instead 代替,顶替
思路:
1. 本题的意思是从给定的n个元素的序列中找出排在最前面且只在序列中出现一次的数即为结果,若不存在则输出None;
2. 若本题使用双重循环来从头到尾来判断每个元素是否只在序列中出现了一次则会超时;
3. 由于本次的输入数在区间[1,10000]中,所以开一个10005大小的数组time[]用于在输入时记录输入的数的出现次数,并将输入的数保存到另外一个数组v[]中;
4. 从头开始遍历数组v[]中的每个元素,通过time[]判断其出现的次数是否为1(时间复杂度:O(1)),遇到次数为1结束循环并输出;否则循环执行完毕后输出None;
//PAT ad 1041 Be Unique
#include <iostream>
using namespace std;
#include <vector>
int main()
{
int n,i,j;
cin>>n;
vector<int> v(n); //记录打赌的数
vector<int> time(10005); //记录打赌的数出现的次数
for(i=0;i<n;i++)
{
cin>>v[i];
time[v[i]]++;
}
for(i=0;i<n;i++)
{
if(time[v[i]]==1) //unique
break;
}
if(i==n)
cout<<"None"<<endl; //没人赢
else
cout<<v[i]<<endl; //有人赢
return 0;
}