美团2021秋招 001 小美的用户名、002 小美的仓库整理、003 小美的跑腿代购、004 小团的复制粘贴
题目描述:
[001]
小美是美团的前端工程师,为了防止系统被恶意攻击,小美必须要在用户输入用户名之前做一个合法性检查,一个合法的用户名必须满足以下几个要求:
用户名的首字符必须是大写或者小写字母。
用户名只能包含大小写字母,数字。
用户名需要包含至少一个字母和一个数字。
如果用户名合法,请输出 “Accept”,反之输出 “Wrong”。
[002]
小美是美团仓库的管理员,她会根据单据的要求按顺序取出仓库中的货物,每取出一件货物后会把剩余货物重新堆放,使得自己方便查找。已知货物入库的时候是按顺序堆放在一起的。如果小美取出其中一件货物,则会把货物所在的一堆物品以取出的货物为界分成两堆,这样可以保证货物局部的顺序不变。
已知货物最初是按 1~n 的顺序堆放的,每件货物的重量为 w[i] ,小美会根据单据依次不放回的取出货物。请问根据上述操作,小美每取出一件货物之后,重量和最大的一堆货物重量是多少?
[003]
小美的一个兼职是美团的一名跑腿代购员,她有 n 个订单可以接,订单编号是 1~n ,但是因为订单的时效性,他只能选择其中 m 个订单接取,精明的小美当然希望自己总的获利是最大的,已知,一份订单会提供以下信息,跑腿价格 v ,商品重量 w kg,商品每重 1kg ,代购费用要加 2 元,而一份订单可以赚到的钱是跑腿价格和重量加价之和。小美可是开兰博基尼送货的人,所以自然不会在意自己会累这种事情。请问小美应该选择哪些订单,使得自己获得的钱最多。
请你按照选择的订单编号的从小到大顺序,如果存在多种方案,输出订单编号字典序较小的方案。
[004]
小团是一个莫得感情的 CtrlCV 大师,他有一个下标从 1 开始的序列 A 和一个初始全部为 -1 序列 B ,两个序列的长度都是 n 。他会进行若干次操作,每一次操作,他都会选择 A 序列中一段连续区间,将其粘贴到 B 序列中的某一个连续的位置,在这个过程中他也会查询 B 序列中某一个位置上的值。
我们用如下的方式表示他的粘贴操作和查询操作:
粘贴操作:1 k x y,表示把 A 序列中从下标 x 位置开始的连续 k 个元素粘贴到 B 序列中从下标 y 开始的连续 k 个位置上。原始序列中的元素被覆盖。(注意:输入数据可能会出现粘贴后 k 个元素超出 B 序列原有长度的情况,超出部分可忽略)
查询操作:2 x,表示询问B序列下标 x 处的值是多少。
第001题
import java.util.Scanner;public class Solution {public static boolean isBig(char c) {return ('A' <= c) && (c <= 'Z');}public static boolean isSmall(char c) {return ('a' <= c) && (c <= 'z');}public static boolean isNum(char c) {return ('0' <= c) && (c <= '9');}public static boolean check(String temp){char[] username = temp.toCharArray();int len = username.length;if(len < 2 || (!isBig(username[0]) && !isSmall(username[0]))){return false;}boolean num = false;for(int j = 1;j < len;j ++){if(!isBig(username[j]) && !isSmall(username[j]) && !isNum(username[j])){return false;}if(isNum(username[j]))num = true;}if(num){return true;}return false;}public static void main(String[] args){Scanner scan = new Scanner(System.in);int nums = Integer.parseInt(scan.nextLine());for (int i = 0; i < nums; i++) {String s = scan.nextLine();if(check(s)) System.out.println("Accept");else {System.out.println("Wrong");}}}}
第002题
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.*;public class test {public static void main(String[] args){Scanner scan = new Scanner(System.in);int num = Integer.parseInt(scan.nextLine());String[] temp = scan.nextLine().split(" ");String[] temp2 = scan.nextLine().split(" ");int len = temp.length;int[] weight = new int[len];int[] dosth = new int[len];for(int i = 0;i < len;i ++){weight[i] = Integer.parseInt(temp[i]);dosth[i] = Integer.parseInt(temp2[i]);}int[] right = new int[len];int[] left = new int[len];int rec = 0;for(int i = 0;i < len;i ++){left[i] = rec;rec += weight[i];}rec = 0;for(int i = len - 1;i >= 0;i --){right[i] = rec;rec += weight[i];}for(int i = 0;i < len;i ++){int nowPos = dosth[i] - 1;if(right[nowPos] > left[nowPos]){System.out.println(right[nowPos]);continue;}System.out.println(left[nowPos]);}}}
第003题
import java.util.*;class Order{int id;int price;public Order(int id, int price){this.id = id;this.price = price;}
}
public class test {public static void main(String[] args){Scanner scan = new Scanner(System.in);int n = scan.nextInt();int m = scan.nextInt();Order[] orders = new Order[n];for(int i = 0;i < n;i ++){orders[i] = new Order(i + 1, scan.nextInt() + scan.nextInt() * 2);}Arrays.sort(orders, new Comparator<Order>() {@Overridepublic int compare(Order o1, Order o2) {if(o1.price == o2.price){return o1.id > o2.id ? 1 : -1;}return o1.price > o2.price ? -1 : 1;}});int[] temp = new int[m];for(int i= 0;i < m;i ++){temp[i] = orders[i].id;}Arrays.sort(temp);for(int i = 0;i < m - 1;i ++){System.out.print(temp[i] + " ");}System.out.println(temp[m-1]);}}
第004题
package mainimport ("bufio""fmt""os"
)func main() {var n, m intvar a, b, c, d intin := bufio.NewReader(os.Stdin)fmt.Scanf("%v\n", &n)A := make([]int, n)B := make([]int, n)for i := 0; i < n; i++ {fmt.Scanf("%v", &A[i])B[i] = -1}fmt.Scanf("\n")fmt.Scanf("%v\n", &m)for ; m > 0; m-- {fmt.Fscan(in, &a)if a == 2 {fmt.Fscan(in, &b)fmt.Println(B[b-1])}else{fmt.Fscan(in, &b, &c, &d)for i, j := c-1, d-1; j < n && i < n && b > 0; {B[j] = A[i]j++i++b--}}}}