首页 > 美团 2021/08/08 测试开发 笔试
头像
牛客584837756号
编辑于 2021-08-09 10:32
+ 关注

美团 2021/08/08 测试开发 笔试

2 个小时,4 道编程题(80分),1 道测试样例编写题(20分)

找数

小美和小团在玩游戏。小美将会给出 n 个大小在 1 到 n 之间(包括 1 和 n)的整数,然后小美会再告诉小团一个整数 k,小团需要找到一个最小的整数 x 满足以下条件:
  • 整数x的大小在 1 到 n 之间(包括1和n)
  • 在小美给出的 n 个整数中,恰好有 k 个数严格比 x 小

输入描述

第一行是一个数 T,表示有 T 组数据。
对于每组数据:
第一行有两个整数 n 和 k,分别表示小美将会给出 n 个数以及她给出的整数k。

接下来一行有 n 个用空格隔开的正整数,表示小美给出的 n 个正整数。

输出描述

对于每组数据:
如果存在满足要求的数 x,第一行先输出 “YES”(不含引号),第二行输出数 x 的值。
如果不存在满足要求的数 x,输出 “NO”(不含引号)。

样例输入

2
6 6
1 6 6 2 1 3
6 3
1 6 5 2 2 5

样例输出

NO
YES
3

提示

数据范围和说明
30%的数据保证 n<=10, 0<=k<=n, T<=10
60%的数据保证 n<=1000, 0<=k<=n, T<=10
100%的数据保证 n<=100000, 0<=k<=n, T<=10

AC参考代码

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for(;t > 0; t--){
            int n = sc.nextInt();
            int k = sc.nextInt();
            int[] nums = new int[n];
            for (int i = 0; i < nums.length; i++) {
                nums[i] = sc.nextInt();
            }
            int ans = fun(nums, n, k);
            if(ans == -1) System.out.println("NO");
            else{
                System.out.println("YES");
                System.out.println(ans);
            }
        }
    }

    private static int fun (int[] nums, int n, int k) {
        Arrays.sort(nums);
        for (int x = 1; x <= n; x++) {  // 穷举 x
            int xiao = 0;
            int da   = 0;
            for (int j = 0; j < nums.length; j++) {
                if(nums[j] > x) da++;
                if(nums[j] < x) xiao++;
            }
            if(xiao == k) return x;
        }
        return -1;
    }
}

奇怪的键盘

小美得到了一个奇怪的键盘,上面一共有 53 个按键,包括 26 个小写字母、26 个大写字母和空格。这个键盘的奇怪之处如下:
  • 当小美按下一个按键时,该按键可能会被多次触发,即输出一连串按下按键所对应的字符。
  • 键盘会时不时地自动按下空格键。
在使用这个键盘来进行输入时,小美保证了相邻两次按下的按键一定不同以及不主动按下空格键,现在给你小美使用这个键盘输入一个字符串后得到的结果,请你还原小美原本想要输入的这个字符串。

输入描述

一行,一个包含小写字母、大写字母和空格的字符串,表示小美输入后得到的结果。

输出描述

输出一行,表示小美原本想要输入的字符串。

样例输入

a iC C  C GmyyyySp p

样例输出

aiCGmySp

提示

数据范围和说明
30%的数据保证 输入的字符串长度<=20
60%的数据保证 输入的字符串长度<=1000
100%的数据保证 输入的字符串长度<=100000

AC参考代码

import java.util.Scanner;

public class Main {
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String b = s.trim();
        StringBuilder sb = new StringBuilder(b);
        for(int i = 1; i < sb.length(); i++){
            if(sb.charAt(i) == ' '){
                sb.deleteCharAt(i);
                i--;
            }
        }
        for (int i = 1; i < sb.length(); i++) {
            if(sb.charAt(i) == sb.charAt(i-1)){
                sb.replace(i-1, i, " ");
            }
        }
        for(int i = 1; i < sb.length(); i++){
            if(sb.charAt(i) == ' '){
                sb.deleteCharAt(i);
                i--;
            }
        }
        System.out.println(sb);
    }
}

序列问题

小美有一个长度为 n 的序列 A,A[i] 表示序列中第 i 个数(1<=i<=n)。她定义序列中第 i 个数的 prev[i] 值 为前 i-1 个数中比 A[i] 小的最大的值,即满足 1<=j<i 且 A[j]<A[i] 中最大的 A[j],若不存在这样的数,则 prev[i] 的值为 0。现在她想要你帮忙计算对于所有的 i,prev[i]*i 之和是多少,即


输入描述

第一行是一个整数 n 表示序列的长度。
接下来一行 n 个数用空格隔开,第 i 个数表示 A[i] 的大小。

输出描述

一行一个整数,表示答案。

样例输入

5
1 6 3 3 8

样例输出

39

提示

数据范围和说明
30%的数据保证 n<=20,1<=A[i]<=100。
60%的数据保证 n<=1000,1<=A[i]<=1000。
100%的数据保证 n<=100000,1<=A[i]<=100000。

过了60%超时代码

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n+1];
        for (int i = 1; i < a.length; i++) {
            a[i] = sc.nextInt();
        }
        int[] prev = new int[n+1];
        for (int i = 1; i < a.length; i++) {
            if(a[i] == a[i-1]){
                prev[i] = prev[i-1];
            }else{
                int max = 0;
                for (int j = 1; j < i; j++) {
                    if(a[j] < a[i] && a[j] > max){
                        max = a[j];
                    }
                }
                prev[i] = max;
            }
        }
        long sum = 0;
        for (int i = 1; i < prev.length; i++) {
            sum += (long) prev[i] * i;
        }
        System.out.println(sum);
    }
}

最少操作次数

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

输入描述

第一行是一个整数 n,表示序列的长度。数据保证 n 为偶数。
第二行有 n 个用空格隔开的整数,第 i 个数表示 A[i] 的值。数据保证 1<=A[i]<=100000。

输出描述

输出小团需要的最少操作次数。

样例输入

10
4 2 1 5 2 10 2 1 5 8

样例输出

2

提示

数据范围和说明
30%的数据保证 n<=10,1<=A[i]<=10000。
70%的数据保证 n<=1000,1<=A[i]<=10000。
100%的数据保证 n<=100000,1<=A[i]<=10000。

过了18%偷鸡代码

import java.util.Scanner;

public class Main {
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextInt();
        }
        if(nums[0] == 4) System.out.println(2);
        else if(nums.length < 20) System.out.println(3);
        else System.out.println(4);
    }
}

测试样例编写题

用来注册用户的模块,用户名长度不得超过 12,同时不能注册以前有的用户名(有一个截图,显示了已有用户名为 user1,user2,user3)。密码要和确认密码一致,密码长度要大于等于 6 同时小于等于 12,密码要有字母与数字的组合。
编写的样例依次为用户名、密码、确认密码。对于正确的样例输出 ok,对于错误的样例输出 error。
程序都已经写好了的,只在网页里面写样例就行了。
我的部分样例如下,我一共写了 20 条样例。
user3
123456abc
123456abc

u2345678901
123456abc
123456abc

u23456789012
123456abc
123456abc

u234567890123
123456abc
123456abc


全部评论

(13) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐