美团笔试
第一题字符串校验:ac
代码:
import java.util.Scanner; /** * 2021届秋招美团笔试 * 字符串检查: * 1、第一个必须是大小写字母; * 2、只能包含字母和数字 * 3、字母和数字分别至少有一个 */ public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int t = in.nextInt(); in.nextLine(); String[] strings = new String[t]; for (int i = 0; i < t; i++) { strings[i] = in.nextLine(); } for (int i = 0; i < strings.length; i++) { solution(strings[i]); } } public static void solution(String string) { if (string == null||string.length()<2) { System.out.println("Wrong"); return; } char head = string.charAt(0); if (head < 65 || (head > 90 && head < 97) || head > 122) { System.out.println("Wrong"); return; } int num = 0; int charNum = 0; for (int j = 0; j < string.length(); j++) { char temp = string.charAt(j); if (temp < 48 || (temp > 57 && temp < 65) || (temp > 90 && temp < 97) || temp > 122) { System.out.println("Wrong"); return; } if (temp >= 48 && temp <= 57) { num++; } if (temp >= 65 && temp <= 90 || temp >= 97 && temp <= 122) { charNum++; } } if (num >= 1 && charNum >= 1) { System.out.println("Accept"); } else { System.out.println("Wrong"); } } }
第二题:跑腿订单 ac
import java.util.*; /** * 跑腿送外卖 * 输入:n,m,n表示订单数量,m表示可以拿的订单数; * 工资:跑腿费+2*订单重量 * 输出:可以获得的金钱最大的方案对应选择的订单标号,如果有多个,选择字典序小的 */ public class Main { private static List<Integer> list = new ArrayList<>(); public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int m = in.nextInt(); int[] nums = new int[n]; for (int i = 0; i < nums.length; i++) { int price = in.nextInt(); int weight = in.nextInt(); nums[i] = price + 2 * weight; } List<Integer> res = new ArrayList<>(); for (int i = 0; i < nums.length; i++) { list.add(nums[i]); } while (m > 0) { res.add(findMax()); m--; } int[] arr = new int[res.size()]; for (int i = 0; i < res.size(); i++) { arr[i] = res.get(i); } Arrays.sort(arr); for (int i = 0; i < arr.length; i++) { if (i == 0) { System.out.print(arr[i]); } else { System.out.print(" " + arr[i]); } } } public static int findMax() { int index = 0; int max = 0; for (int i = 0; i < list.size(); i++) { max = Math.max(max, list.get(i)); } for (int i = 0; i < list.size(); i++) { if (list.get(i) == max) { index = i + 1; break; } } list.set(index-1, -1); return index; } }
第三题:最大子序列和 64%
代码:
import java.util.Scanner; /** * 给定一个序列,按某个顺序依次取出序列中的数据,每次取完相当于把序列分割开来,变成多个子序列, * 每次取完,输出一下当前存在的子序列中和最大的值 */ public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] thing = new int[n]; int[] sort = new int[n]; for (int i = 0; i < n; i++) { thing[i] = in.nextInt(); } for (int i = 0; i < n; i++) { sort[i] = in.nextInt(); } for (int i = 0; i < n; i++) { thing[sort[i]-1] = 0; solution(thing); } } public static void solution(int[] thing) { int n = thing.length; long max = 0; long temp = 0; for (int i = 0; i < n; i++) { if (thing[i] != 0) { temp += thing[i]; } else { max = Math.max(max, temp); temp = 0; } max = Math.max(max, temp); } System.out.println(max); } }
第四题:不会
/** * 输入:n,k;n表示节点的个数,k表示最大节点值和最小节点值的差的最大值 * 之后输入n-1行:每行有两个数字,分别表是节点序号,输入的两个序号表示两个节点之间是相连的 * 输入一行:n个数,分别表示每个节点的值 * 输出:存在多少种可以连通的节点选择,保证最大节点值和最小节点值的差<=k */第五题:
/** * 输入:x,y和x+y个数字 * 把x+y个数字分成两组,一组为x个,一组y个 * 求:分组后两个组的平均值之和为最大,输出分组的选择情况,如果有多组,输出字典序最小的情况 * 例如:x=4,y=4;1,5,3,6,7,3,4,5 * 输出:AAAABBBB */
找到一种特殊情况:x=y时,直接输出x个Ay个B就行