美团笔试
第一题字符串校验: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就行


