PAT 甲级 1041 附带易错点和算法分析
**易错分析:**这道题是万万不能用双重循环以此比较这个数字在数组中是否唯一这种方法的,不仅不易写对,而且一定超时。这种就属于算法错误了。
算法:最好的方法是建立一个100001大小的数组(实际上可以不用这么大,保证算法正确的情况下,如果超时可以将这个数字改小一点,因为测试用例中的数据没有给到这么大的),记录重复的数字,最后将内容为1(说明唯一)的拿出来比较谁在bets(输入数据数组)的最前面就好了。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {
public static void main(String[] args)throws Exception {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String[] s=br.readLine().split(" "); //要用BufferedReader,在读入数据特别多的情况
br.close(); //下优势就显现出来了,比Scanner快得多
int N=Integer.parseInt(s[0]);
int[] bets=new int[N];
for(int i=1;i<s.length;i++){
bets[i-1]=Integer.parseInt(s[i]);
}
int[] nums=new int[100001]; //后两个测试点如果运行超时,这个100001可以改小一点
for(int i=0;i<N;i++){ //亲测50001能全部AC
nums[bets[i]]++;
}
ArrayList<Integer> list=new ArrayList<>();
for(int i=0;i<nums.length;i++){
if(nums[i]==1){ //找nums数组中为1的下标,为1说明只有一个,满足unique的条件
list.add(i);
}
}
if(list.size()==1){
System.out.print(list.get(0));
System.exit(1);
}else if(list.size()>1){
ArrayList<Integer> index=new ArrayList<>();
for(int i=0;i<N;i++){
for(int j=0;j<list.size();j++){
if(list.get(j)==bets[i]){
System.out.print(bets[i]);
System.exit(1);
break;
}
}
}
}else{
System.out.print("None");
}
}
}