凉飕飕~~真的是劝退式笔试呀~
美团的题型有三部分
1.逻辑题20道(看图形找规律,数学题,还有阅读题,很难)
2.技术选择题30道(考了很多指针的,结果c++我真的已经忘得差不多了,后来已经自暴自弃的乱选了)
3.两道编程答题(哎,一道都没做出来)
编程题1.
(这道题一看到图,就立马放弃了,还是没刷图的题目的原因呀,太陌生了)
给定一张包含N个点、N-1条边的无向连通图,节点从1到N编号,每条边的长度均为1。假设你从1号节点出发并打算遍历所有节点,那么总路程至少是多少?
输入
第一行包含一个整数N,1≤N≤100000。
接下来N-1行,每行包含两个整数X和Y,表示X号节点和Y号节点之间有一条边,1≤X,Y≤N。
输出
输出总路程的最小值。
这题也是参考牛客上大佬的,真的思路很值得参考!!自己怎么也不会想到。
作者:WAK
链接:https://www.nowcoder.com/discuss/104554?type=2
来源:牛客网
思路:走完所有节点类似于深度优先搜索,也就是说除了最后一条路径外,别的路径都经历了正着走,再返回
的过程,也就是两遍,设最后一条路径为x,总分支数为n-1,总路径=2*(n-1-x)+x=2*n-2-x,当x最大时
总路径最小,所以转化为求多叉树的深度。
import java.util.Scanner;
public class Meituan01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int[] arr=new int[n+1];
int depth=0;
//记录每个结点的深度
for(int i=0;i<n-1;i++){
int a=in.nextInt();
int b=in.nextInt();
arr[b]=arr[a]+1;
}
//找出最大的深度
for(int j=1;j<=n;j++){
depth=arr[j]>depth?arr[j]:depth;
}
System.out.println(2*n-2-depth);
}
}
第二题
小明拿到了一个数列a1 , a2 , ... an ,小明想知道存在多少个区间[l,r]同时满足下列两个条件:
1、r-l+1=k;
2、在a l , a l+1,...ar中,存在一个数至少出现了 t 次。
输出满足条件的区间个数。
参考牛客上大佬的答案的,想明白思路的,之前也想到用集合,但是没有想到hashmap,哎。
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Meituan02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int n=in.nextInt();
int k=in.nextInt();
int t=in.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=in.nextInt();
}
int res=0;
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<n;i++){
if(i>=k){
Integer integer=map.get(arr[i-k]);
map.put(arr[i-k], integer);
}
Integer orDefault=map.getOrDefault(arr[i], 0);
map.put(arr[i], orDefault+1);
if(i>=k-1){
int count=0;
for(int key : map.keySet()){
count=count>map.get(key)?count:map.get(key);
}
if(count>=t){
res++;
}
}
}
System.out.println(res);
}
}