第一题:我猜是贪心,分别统计每个数字的最大值,然后统计每个频次出现的数字数目,然后分别从最大值开始贪心,最后写的,没时间了当前值的频次a     小于等于频次a的所有的数字总数为 m     频次大于a的数字个数(不是总数)为b    如果 a + m + b*a >=k ,那么当前数就是最大的众数import java.util.*;public class Main {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        int t = in.nextInt();in.nextLine();        int[] res = new int[t];        for(int i = 0;i<t;i++){            int n = in.nextInt(),k = in.nextInt();in.nextLine();            int[] a = new int[n];            Map<Integer,Integer> map = new HashMap<>();            for(int j=0;j<n;j++){                a[j] = in.nextInt();                map.put(a[j],map.getOrDefault(a[j],0)+1);            }            Map<Integer,Integer> map2 = new HashMap<>();            for(Map.Entry<Integer,Integer> e:map.entrySet()){                map2.put(e.getKey(),map2.getOrDefault(e.getKey(),0)+1);            }            Arrays.sort(a);            int cnt = 0;            int mx;            for(int j=n-1;j>=0;j--){                int times = map.get(a[j]);                int c = times;                for(int z=1;z<=times;z++){                    if(map2.get(z)!=null){                        c+=map2.get(z);                        if(c>=k){                            res[i]=a[j];                            break;                        }                    }                }                if(res[i]!=0){                    break;                }                j-=times-1;            }        }        for(int i=0;i<t;i++){            System.out.println(res[i]);        }    }}第二题:数论?(菜鸟不懂是哪个类别的)就是如果当前的x>n ,那么在n位置就是x%n的值,所以需要一次取余在[x+1,... ]位置就是 x 的值,因为x对于一个大于x的值取余为x,这里右界看一下就好了,不好写,因为n的值不定(所以有一个特判)在[1,x] 的左侧就是0,因为x一旦到了x的位置取余之后一直是0但是这题需要看一下边界,就是 k<=x+1(被边界卡了不少时间)import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息public class Main {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        int t = in.nextInt();in.nextLine();        int[] res = new int[t];        for(int i = 0;i<t;i++){            int n = in.nextInt(),x = in.nextInt(),k = in.nextInt();            if(k==n+1){                // System.out.println("special");                res[i] = x; // 特判            }            else{                x = x%n; // 第 n 项                if(k<=x+1){                    // System.out.println("left");                    res[i] = 0; // 如果查询在 x 的左侧,取余结果为0                }                else{                    // System.out.println("right");                    res[i] = x; // 如果查询在 x 右侧,得到 x                 }            }        }        for(int i=0;i<t;i++){            System.out.println(res[i]);        }    }}这题没看懂,应该是并查集,如果两个端点祖先相同,输出yes,否则no然后看了示例感觉好像可以构成多个那个不知道什么名字的玩意儿那么需要确定之前出现的边有没有构成环,我就用一个map记录每次构成环的时候的祖先节点,    如果一个无环的域和成环的域连接了,需要将无环域的原本祖先也记录进去,否则无环域的非祖先节点没有当前域已经承欢的信息    但是最后也不行    这题调了快半个小时,绝望了import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息public class Main {    public static void main(String[] args) {        class Union{            int[] fa;            public Union(int n){                fa = new int[n+1];                for(int i = 0;i<n+1;i++){                    fa[i] = i;                }            }            public int find(int u){                if(fa[u] == u){                    return u;                }                int f = find(fa[u]);                fa[u] = f; // 变胖                return f;            }            public boolean isU(int u,int v){                if(find(u)==find(v)){                    return true;                }                return false;            }            public void u(int u,int v){                int uu = find(u),vv = find(v);                fa[uu] =vv;            }            public void print(){                for(int i=0;i<fa.length+1;i++){                    System.out.println(i+ " de fa is "+ fa[i]);                }            }        }        Scanner in = new Scanner(System.in);        int n = in.nextInt(), m = in.nextInt();in.nextLine();        boolean sign = true;        Union union = new Union(n);        boolean[] res = new boolean[n];        Map<Integer,Boolean> map = new HashMap<>();        for(int i = 0;i<n+1;i++){            map.put(i,false);        }        // union.print();        for(int i=0;i<m;i++){            int u=in.nextInt(),v = in.nextInt();in.nextLine();            int uf = union.find(u);            int uv = union.find(v);            if(map.get(uf) || map.get(uv) ){                res[i] = false;                if(!map.get(uf)){ // 顺序不能错                    union.u(u,v);                    map.put(uf,true);                }else if (!map.get(uv)){                    union.u(v,u);                    map.put(uv,true);                }                continue;            }            if(union.isU(u,v)){                // System.out.println(i+ "  "+" true");                map.put(union.find(u),true);                res[i] = true;            }            else{                // System.out.println(i+ "  "+" false ");                res[i] = false;                union.u(u,v);            }        }        // union.print();        for(int i = 0;i<n;i++){            System.out.println(res[i]?"Yes":"No");        }    }}总得分0+1+0.03,哎😔一开始忘记了笔试,中途开始写,太慌了,而且不给用IDEA,好难调代码啊
点赞 9
评论 5
全部评论

相关推荐

已注销:再接着投吧项目经历太流水账,且没有实习经历,我之前也是这样,后来跟着大厂导师修改了项目和简历之后成功上岸,有需要可以问我
点赞 评论 收藏
分享
07-30 13:44
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务