PAT甲级1041 Be Unique 附带易错点和算法分析

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

发布了24 篇原创文章 · 获赞 0 · 访问量 1911
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览