8-8美团笔试

总共五题编程,虐了我两个小时(😂有大佬帮我帮我解答一下吗
小美和小团在玩游戏。小美将会给出n个大小在1n之间(包括1n)的整数,然后小美会再告诉小团一个整数k,小团需要找到一个最小的整数x满足以下条件: 整数x的大小在1n之间(包括1n在小美给出的n个整数中,恰好有k个数严格比x
只ac了90%,也没超时,,,搞不明白😥
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        int m=scanner.nextInt();

        while(m-->0){
            int n=scanner.nextInt();
            int k=scanner.nextInt();
            
            int[] nums=new int[n];
            for(int i=0;i<n;i++){
                nums[i]=scanner.nextInt();
            }

            Arrays.sort(nums);
            int ans=nums[k-1]+1;
            if((k<n&&ans>nums[k])||ans>n){
                System.out.println("NO");
            } else{
                System.out.println("YES\n"+ans);
            }
        }
    }

优化:
public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m=scanner.nextInt();

        while(m-->0){
            int n=scanner.nextInt();
            int k=scanner.nextInt();
            int[] nums=new int[n+1];
            for(int i=0;i<n;i++){
                int j=scanner.nextInt();
                nums[j]++;
            }

            if(k==n){
                if(nums[n]!=0){
                    System.out.println("NO");
                } else{
                    for(int i=n;i>0;i--){
                        if(nums[i]!=0){
                            System.out.println("YES\n"+(i+1));
                            break;
                        }
                    }
                }
            } else {

                int cnt = 0;
                int i = 1;
                for (; i <= n; i++) {
                    cnt += nums[i];
                    if (cnt >= k) {
                        break;
                    }
                }

                if (cnt != k) {
                    System.out.println("NO");
                } else {
                    System.out.println("YES\n" + (i + 1));
                }
            }
        }
    }



小美给了小团一个长度为nn为偶数)的序列A,序列中的数都是介于[1,100000]的整数。小团想把这个序列变得漂亮后再送回给小美。小美觉得一个序列是漂亮的当且仅当这个序列的前一半和后一半是一样的,即对于1<=i<=n/2都满足A[i]==A[i+n/2]。
小团可以按进行以下操作任意次:
选择两个介于[1, 100000]之间的数xy,然后将序列A中所有值为x的数替换为y。
注意,每次操作都会在上一次操作后得到的序列上进行。小团想知道他最少需要操作多少次可以把序列变成漂亮的。
这题完全不会,没思路😂


#美团笔试##美团#
全部评论
if (k<1)      System.out.println("NO"); int x = arr[k-1]+1; if (k<n&&x<=n&&arr[k]>arr[k-1])      System.out.println("YES"); else      System.out.println("NO");
1 回复
分享
发布于 2021-08-08 15:22
都sort了, 说没超时你自己信吗
点赞 回复
分享
发布于 2021-08-08 12:09
联易融
校招火热招聘中
官网直投
k=0你没判断,我也是,调了10几分钟
点赞 回复
分享
发布于 2021-08-08 12:12
关于第二题,我感觉就直接,从0 遍历到 n/2 -1 , 然后如果a[i] == a[i+ n/2] 就continue,如果不是,在这两个数之间随便选择一个数,比如选择把所有的a[i] 变成 a[i+n/2] 然后继续遍历,(改值的时候可以用哈希表把旧值和新值存起来,每次遍历的时候查看,这个值是否需要被替换,这样不用每次都遍历之后的数据)最后得到需要的操作数。(本人水硕,如果有问题请各位大佬指出)
点赞 回复
分享
发布于 2021-08-08 19:11
第二题并查集
点赞 回复
分享
发布于 2021-08-09 08:35

相关推荐

3 8 评论
分享
牛客网
牛客企业服务