当前位置:   article > 正文

5.7java美团后端笔试题解_美团java笔试题库及答案

美团java笔试题库及答案

事先说明:

 本文题目转载自 :(61条消息) Java后端之美团笔试题_最耀眼的那个繁星的博客-CSDN博客

 本文题解转载自:5.7 美团后端笔试 提前20min AK_笔经面经_牛客网

本文是笔者的学习过程,在原有代码上加了一些理解性的注释。 (如侵,则删)

题目一:
小团饲养了一小缸鱼,并且买了A、B、C三类饲料来喂养它们,小团的饲养计划如下:
—— 在每周一、五、六,喂8粒A类饲料;
—— 在每周二、日,喂5颗B类饲料;
—— 在每周三、四,喂7颗C类饲料。
 假设在某个周一,小团一次性购买了A、B、C三类饲料各a、b、c颗,并在当天开始饲养,请问如果小团按照它的饲养计划进行喂食,请问这批饲料可以吃多少天(周一当天也算一天)?

样例输入
8 6 6
样例输出
2
 

  1. import java.util.Scanner;
  2. public class Main_0 {
  3. public static void main(String[] args) {
  4. //模拟
  5. Scanner scanner = new Scanner(System.in);
  6. int a = scanner.nextInt();
  7. int b = scanner.nextInt();
  8. int c = scanner.nextInt();
  9. //判断能喂食几天
  10. int da = a /8;
  11. int db = b /5;
  12. int dc = c /7;
  13. int res =0;
  14. for (int i = 1; ;i++) {
  15. int r = i % 7;
  16. switch (r){
  17. case 1:
  18. case 5:
  19. case 6:
  20. if(da == 0 ){
  21. System.out.println(res);
  22. return;
  23. }
  24. da--;
  25. res++;
  26. break;
  27. case 0:
  28. case 2:
  29. if(db == 0 ){
  30. System.out.println(res);
  31. return;
  32. }
  33. db--;
  34. res++;
  35. break;
  36. case 3:
  37. case 4:
  38. if(dc == 0 ){
  39. System.out.println(res);
  40. return;
  41. }
  42. dc--;
  43. res++;
  44. break;
  45. default: return;
  46. }
  47. }
  48. }
  49. }

题目二:
小美得到了一个只包含’0’和’1’两种字符的字符串,现在她可以往这个字符串的任意位置添加任意个字符’1’,请问她至少需要添加多少个字符’1’才能使添加后的字符串是一个回文串?
输入描述
第一行一个整数T,表示有T组数据。
接下来T行,第i行是一个只包含’0’和’1’两种字符的字符串si。
1<=T<=10, 1<=字符串si的长度<=100000
输出描述
T行,每行一个整数,其中第i行表示输入描述中的字符串si至少需要添加多少个字符’1’使其变成回文串。
样例输入
4
10101
00001
01001101
1110
样例输出
0
1
2
3
样例解释
添加的字串用[]示意:
10101=>10101,无需添加即是回文串。
00001=>[1]00001
01001101=>[1]01[1]001101
1110=>1110[1][1][1]
 

  1. import java.util.Scanner;
  2. public class Main_1 {
  3. public static void main(String[] args) {
  4. //双指针
  5. Scanner sc = new Scanner(System.in);
  6. int n = sc.nextInt();
  7. do {
  8. int[] arr = new int[n];
  9. for (int i = 0; i < n; i++) {
  10. arr[i] = add(sc.next());
  11. }
  12. for (int i = 0; i < arr.length; i++) {
  13. System.out.println(arr[i]);
  14. }
  15. } while (n >= 1 && n <= 10);
  16. }
  17. private static int add(String str){
  18. int res =0;
  19. //字符串转成字符型数组
  20. char[] s=str.toCharArray();
  21. int l=0,r=s.length-1;
  22. while(l<r){
  23. if(s[l] == s[r]){
  24. l++;
  25. r--;
  26. }else if(s[l] == '1'){
  27. res++;
  28. l++;
  29. }else{
  30. res++;
  31. r--;
  32. }
  33. }
  34. return res;
  35. }
  36. }

题目三:
时间限制: 3000MS
内存限制: 589824KB
题目描述:
小团在一个无限长的一维坐标轴上玩一个探险游戏,初始时他位于原点,并有k点体力。每往正方向走一格(无法往反方向移动)需要消耗一点体力。要求小团在任何时刻体力都不能小于零。已知坐标轴上有n个坐标上有体力药水,到达这些坐标时,可以恢复一定量的体力。小团想知道,他所能到达的最远坐标是多远?
<p>
输入描述
第一行两个正整数k、n,分别表示小团初始有k点体力,以及坐标轴上有n个坐标上有体力药水。
接下来一行n个正整数,第i个数xi表示在xi这个坐标上有体力药水。(xi互不相同)
接下来一行n个正整数,第i个数ti表示在xi这个坐标上的体力药水可以恢复ti点体力。
1<=k <=2000000, 1<=n<=20000,1<=xi<=100000000,1<= ti<=10000
输出描述
一行一个正整数,表示小团所能到达的最远坐标。
样例输入
5 2
6 3
1 2
样例输出
8
提示
样例解释1
初始有5点体力,到达坐标3时还剩余2点体力,补充2点,共余4点;
到达坐标6时还剩下1点,补充1点,共余2点;
耗尽体力时处于坐标8。
输入样例2
2 1
2
1
输出样例2
3
样例解释2
初始有2点体力,在坐标2补充1点体力到达坐标3。
输入样例3
2 1
3
1
输出样例3
2
样例解释3
初始有2点体力,到达坐标2耗尽体力停止。
 

  1. import java.util.PriorityQueue;
  2. import java.util.Scanner;
  3. public class Main_2 {
  4. public static void main(String[] args) {
  5. //底层逻辑——预排序+模拟
  6. Scanner sc = new Scanner(System.in);
  7. int k = sc.nextInt();
  8. int n = sc.nextInt();
  9. int[] x = new int[n];
  10. int[] t = new int[n];
  11. for (int i = 0; i < n; i++) {
  12. x[i] = sc.nextInt();
  13. }
  14. for (int i = 0; i < n; i++) {
  15. t[i] = sc.nextInt();
  16. }
  17. //案例
  18. // 5 2
  19. // 6 3
  20. // 1 2
  21. // 输出8
  22. PriorityQueue<int[]> que = new PriorityQueue<>((a, b) -> a[0] - b[0]);
  23. for (int i = 0; i < n; i++) {
  24. //优先队列 默认是小顶堆 最小元素在堆顶
  25. que.add(new int[]{x[i],t[i]});
  26. //[3,2] [6,1]
  27. }
  28. //判断站点
  29. int res = 0;
  30. while(!que.isEmpty()){
  31. //取堆顶,且去除,先[3,2]再[6,1]
  32. int[] xt = que.poll();
  33. //剩余体力是否能到达第一个点
  34. if (k + res < xt[0]){
  35. res += k;
  36. System.out.println(res);
  37. return;
  38. } else {
  39. //能的话,先吧到第一个点剩余体力算出来,然后加上奖励的体力
  40. //此时站点在xt[0]->(赋值给)res
  41. k -= xt[0] - res;
  42. k += xt[1];
  43. res = xt[0];
  44. }
  45. }
  46. //都执行结束,还有体力就多走k步
  47. System.out.println(res + k);
  48. }
  49. }

题目四:
代金券
时间限制: 3000MS
内存限制: 589824KB
题目描述:
小美和小团来到了一家餐厅吃饭,美团上有许多代金券,形如花xi元购买,可以当yi元使用(保证yi>xi)。至多只能购买一张代金券。
对于餐厅里的每种菜品,有价格ai和能够给予给他们的满意度bi。每种菜品至多只会点一份。
代金券是一次性无找零的,若本次消费的价格不高于代金券可以抵用的价格,那么可以使用代金券来抵付本次的所有消费;若本次消费的价格高于可抵用价格,那么还需要支付超出的部分。

下面给出两个例子:
——如果本次需要消费270元,小美和小团花了250元购买了一张可以抵300元的代金券,那么使用这张代金券可以完全抵付,他们实际花费250元;
——如果本次消费需要230元,小美和小团花了150元购买了一张可以抵199的代金券,那么他们使用代金券可以抵199元,但还需要支付超出的230-199=31元,他们实际花费150+31=181元。
假设他们这次吃饭的预算是k元,请问他们能得到的最高满意度是多少?

输入描述
第一行3个整数n、m、k,分别表示美团上有n种代金券、餐厅的菜单上有m种菜品、以及小美和小团的预算是k元。
接下来n行,每行两个整数,第 i 行xi和yi分别表示代金券的价格为xi元,可以抵用yi元。
接下来m行,每行两个整数,第i行ai和bi分别表示菜品的价格为ai元,该菜品可以给予他们的满意度为bi。
1<=n<=20,1<=m<=200, 1<=k<=10000, 1<=xi<=yi<=20000, 1<=ai,bi<=500
输出描述
输出一个整数,表示小美和小团在预算内最多能获得多高的满意度。
样例输入
2 3 10
7 10
10 12
7 4
2 4
5 6
样例输出
10
提示
样例解释
点的菜品为第1种与第3种,满意度为10,需要支付12元。
可以选择第一种代金券,抵用10元再额外支付2元,一共花费7+2=9元,在预算内;
也可以选择第二种代金券,直接抵用12元,无需额外再支付,花费10元,在预算内。
 

  1. import java.util.Scanner;
  2. public class Main_3 {
  3. public static void main(String[] args) {
  4. //背包问题,动态规划(dp)
  5. Scanner sc = new Scanner(System.in);
  6. int n = sc.nextInt();
  7. // n种代金券
  8. int m = sc.nextInt();
  9. // m种菜品
  10. int k = sc.nextInt();
  11. // k预算金额
  12. int money = k;
  13. for (int i = 0; i < n; i++) {
  14. int x = sc.nextInt();
  15. int y = sc.nextInt();
  16. if(k > x) {money = Math.max(k-x+y,money);}
  17. //节省几块
  18. }
  19. int[] w = new int[m];
  20. //价格
  21. int[] v = new int[m];
  22. //满意度
  23. for (int i = 0; i < m; i++) {
  24. w[i] = sc.nextInt();
  25. v[i] = sc.nextInt();
  26. }
  27. int[][] dp = new int[m + 1][money + 1];
  28. //dp[i][j]:使用 j钱 在 前i个菜品中选获得的最大满意度
  29. for (int i = 1; i <= m; i++) {
  30. for (int j = 1; j <= money; j++) {
  31. if (j > w[i-1]){
  32. //'背包能装下'
  33. dp[i][j] = Math.max(dp[i-1][j-w[i-1]] + v[i-1], dp[i-1][j]);
  34. } else {
  35. dp[i][j] = dp[i-1][j];
  36. }
  37. }
  38. }
  39. System.out.println(dp[m][money]);
  40. }
  41. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/802355
推荐阅读
相关标签
  

闽ICP备14008679号