2019美团后台开发工程师笔试

凉飕飕~~真的是劝退式笔试呀~

美团的题型有三部分

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);
			

	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值