美团编程笔试合集(持续更新)

题目一:淘汰分数

某比赛已经进入了淘汰赛阶段,已知共有n名选手参与了此阶段比赛,他们的得分分别是a_1,a_2….a_n,小美作为比赛的裁判希望设定一个分数线m,使得所有分数大于m的选手晋级,其他人淘汰。但是为了保护粉丝脆弱的心脏,小美希望晋级和淘汰的人数均在[x,y]之间。显然这个m有可能是不存在的,也有可能存在多个m,如果不存在,请你输出-1,如果存在多个,请你输出符合条件的最低的分数线。

- 输入第一行仅包含三个正整数n,x,y,分别表示参赛的人数和晋级淘汰人数区间。
- 输入第二行包含n个整数,中间用空格隔开,表示从1号选手到n号选手的成绩。
- 输出仅包含一个整数,如果不存在这样的m,则输出-1,否则输出符合条件的最小的值。
import java.util.*;
/*
本题其实和输入的分数没有关系 只和总人数 还有淘汰区间[x,y]有关
若总人数n-y>y;比如10个人,[2,4];10-4>4;说明不管怎么分都不可能使得淘汰的和通过的人数都在区间[2,4];
 */
public class One {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int x = input.nextInt();
        int y = input.nextInt();
        int[] scores = new int[n];
        for (int i = 0; i < n; i++) {
            scores[i] = input.nextInt();
        }
        Arrays.sort(scores);
        int value=n-y;
        //n-y>y;比如10个人,[2,4];10-4>4;说明不管怎么分都不可能使得淘汰的和通过的人数都在区间[2,4];
        if (value>y){
            System.out.println(-1);
        //n-y在区间[x,y];比如7个人,[2,4];7-4=3;
            // 则返回第三个位置的人的分数 因为数组下标从0开始,所以第三个位置下标是2也就是value-1
        }else if (value>=x && value<=y){
            System.out.println(scores[value-1]);
        //n-y<x;比如3个人,[2,4];3-4=-1; 返回分数第x位置的人的分数 同上
        }else{
            System.out.println(scores[x-1]);
        }
    }
}
题目二:正则序列

我们称一个长度为n的序列为正则序列,当且仅当该序列是一个由1~n组成的排列,即该序列由n个正整数组成,取值在[1,n]范围,且不存在重复的数,同时正则序列不要求排序;一个长度为n的任意序列s,需要在有限次操作内,将这个序列变成一个正则序列,每次操作可以任选序列中的一个数字,并将该数字加一或者减一。最少用多少次操作可以把这个序列变成正则序列?

- 输入第一行仅包含一个正整数n,表示任意序列的长度。
- 输入第二行包含n个整数,表示给出的序列,每个数的绝对值都小于10000。
- 输出仅包含一个整数,表示最少的操作数量。
import java.util.*;
/**
 * 正则序列:核心:贪心算法  每一个数字最短距离是升序后:a[i]到i的绝对值
 * 比如升序后序列 -1  3  4  19 100 长度5 则正则序列是【1,5】
 *              1  2  3   4  5  -1到1的最短距离就是 |-1-1|=2 3到2的最短距离 |3-2|=1;
 *              但我们数组一般下标从0开始,所以是 |a[i]-(i+1)|
 *              或者从1开始,就是|a[i-1]-i|
 */
public class Three {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int n=input.nextInt();
        int arr[]=new int[n];
        for (int i = 0; i < arr.length; i++) {
            arr[i]=input.nextInt();
        }
        //对数组进行升序排序
        Arrays.sort(arr);
        int count=0;
        for (int i = 0; i < n; i++) {
            count+=Math.abs(arr[i]-(i+1));
        }
        System.out.println(count);
    }
}
题目三:字符串空格个数

给出一行仅包含空格和小写英文字母的字符串s;其中空格代表被吸走的字符,小写英文字母则是没有被吸走,留下来的字符。
s的长度<=10000输出仅包含一个正整数,表示黑洞吸走的字母数量

public class Two {
    //核心:toCharArray()方法 把字符串变成单个字符类型的数组
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        String s=input.nextLine();
        int count=0;
        char[] chars=s.toCharArray();
        for (int i=0;i<chars.length;i++){
            if (chars[i]==' '){
                count++;
            }
        }
        System.out.println(count);
    }
}
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大龄烤红薯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值