美团 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


#美团笔试##笔试题目##测试#
全部评论
最少操作次数怎么做?越想越迷。序列问题也是暴力求最小值过60%,后来想想,可以每次迭代都先用二分有序插入新来的值,再二分查找,这样时间复杂度是2*O(logn),比O(n)快。
1
送花
回复 分享
发布于 2021-08-08 16:15
有没有题库可以刷一下呀
1
送花
回复 分享
发布于 2021-08-12 17:44
秋招专场
校招火热招聘中
官网直投
找数那个是不是可以理解为n个数里面,找最后一个下标和值相等的,返回其值+1 四行代码搞定 public static int Search(int[] nums,int k) {         Arrays.sort(nums);         if(nums[k-1]==k-1&&nums[k]>nums[k-1])             return k;         return -1;
1
送花
回复 分享
发布于 2021-08-19 23:36
👍
点赞
送花
回复 分享
发布于 2021-08-08 13:17
没有实习经历,没有竞赛经历,没有论文的简历能通过筛选吗😅
点赞
送花
回复 分享
发布于 2021-08-08 21:42
c++ #include <iostream> using namespace std; int main() { int T, n, k,i; cin >> T; while (T--) { int sum = 0; cin >> n >> k; int *a = new int[n + 1]; int *b = new int[n + 1](); for (int i = 1; i < n+1; i++) { cin >> a[i]; b[a[i]]++; } for (i = 1; i < n+1; i++) { sum = sum + b[i]; if ((sum == k) && (i+1<=n)) { cout << "YES" << endl; cout << i+1 <<endl; break; } if ((sum == k && i == n)) { cout << "No" << endl; break; } } if(sum!=k) cout << "No"<<endl; delete a, b; } return 0; }
点赞
送花
回复 分享
发布于 2021-08-08 22:42
欢迎试试shopee,百度或者公众号 shopee招聘,我的内推码:AGHlw
点赞
送花
回复 分享
发布于 2021-08-09 01:30
可以用本地编译器吗?
点赞
送花
回复 分享
发布于 2021-08-09 08:45
感谢楼主分享
点赞
送花
回复 分享
发布于 2021-08-09 14:07
楼主有收到面试通知吗?
点赞
送花
回复 分享
发布于 2021-08-09 14:08
题一样么
点赞
送花
回复 分享
发布于 2021-08-12 17:25
你这是社招还是校招呀?
点赞
送花
回复 分享
发布于 2021-08-18 21:10
请问测试样例编写每个单独保存了但是没点整个题目最下方的保存会没有成绩吗?😂
点赞
送花
回复 分享
发布于 2021-09-11 18:12

相关推荐

9 87 评论
分享
牛客网
牛客企业服务