2024/8/17 美团秋招第二场后端 笔试 算法与数据结构

时间是晚上7点到8点半 总共一个半小时

已知10个元素数据(54,28,16,34,73,62,95,60,26,43)依次插入节点的方法生成一颗二叉排序树,再查找成功的情况下,每个元素的平均比较次数为?

理解二叉树结构

总比较次数应该为 1+2+3+3+2+3+3+4+4+4=29 平均比较次数为2.9

给定一个无向图的节点编号结合为{A,B,C,D,E,F},边的结合为{A-C,A-D,B-C,B-E,B-F,C-D,C-F,E-F},已下选项中,从顶点A出发,不可以得到的深度优先订单序列为:

A: ACDFEB

B:ACFEDB

C:ADCBFE

D:ACFEBD

顺一下

深度优先搜索(DFS)的顺序是由每个节点的访问顺序和访问策略 决定的

从A点出发必须遵循图的结构和路径的选择

选D

小美对gcd 最大公约数很感兴趣 会询问t次

每次给出一个大于1的正整数n 是否找到m 让gcd(n,m)为素数

ACM模式

每组包含多组测试数据

如果有多种合法答案 可以任意输出一种

想法

注意到n是(2~10e5)级别的数

可以考虑用暴力遍历

package Dduo;
import java.math.BigInteger;
import java.util.*;


public class Main {

    static Scanner sc = new Scanner(System.in);
    static long mod = (long) (1e9 + 7);
    static int cnt = 0;

    public static void main(String[] args) {
        int t = 1;
        t=sc.nextInt();
        while (t-- > 0) {
            solve();
        }
        sc.close();
        return;
    }

    private static void solve() {
    	
    	int n=sc.nextInt();
    	for(int i=2;i<=n;i++) {
    		if(isPrime(gcd(i,n))) {
    			System.out.print(i);
    			return;
    		}
    	}
    	System.out.print("-1");
    }
    
    public static int gcd(int a, int b) {
        while (b != 0) {
            int temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }
    
    public static boolean isPrime(int number) {
        if (number <= 1) {
            return false;
        }
        if (number <= 3) {
            return true;
        }
        if (number % 2 == 0 || number % 3 == 0) {
            return false;
        }
        for (int i = 5; i * i <= number; i += 6) {
            if (number % i == 0 || number % (i + 2) == 0) {
                return false;
            }
        }
        return true;
    }
}

给出一个数组 长度为n

给出一个固定整数k

第一步 小美选择一个非空区间 区间内所有的数字乘k

第二步 小团选择一个非空区间 区间内所有的数字乘k

sum为数组所有元素之和 小美想让sum尽可能大 小团想让sum尽可能小

求最后的sum数值

想法

注意到k的范围 (-10e5~10e5)

分k大于小于等于0考虑

可以先找到和最大的连续元素段再返回新数组

再去找最小的

package Dduo;
import java.math.BigInteger;
import java.util.*;


public class Main {

    static Scanner sc = new Scanner(System.in);
    static long mod = (long) (1e9 + 7);
    static int cnt = 0;

    public static void main(String[] args) {
        int t = 1;
//        t=sc.nextInt();
        while (t-- > 0) {
            solve();
        }
        sc.close();
        return;
    }

    private static void solve() {
    	
    	int n=sc.nextInt();
    	int k=sc.nextInt();
    	
    	long arr[]=new long[n];
    	for(int i=0;i<n;i++) {
    		arr[i]=sc.nextLong();
    	}
    	long sum=0;
    	
    	if(k>0) {
    		long ans1[]=findAndMultiplyMaxSumSubarray(arr,k);
    		long ans2[]=findAndMultiplyMinSumSubarray(ans1,k);
    		for(int i=0;i<n;i++) {
    			sum+=ans2[i];
        	}
    		System.out.print(sum);
    	}else if(k<0) {
    		long ans1[]=findAndMultiplyMinSumSubarray(arr,k);
    		long ans2[]=findAndMultiplyMaxSumSubarray(ans1,k);
    		for(int i=0;i<n;i++) {
    			sum+=ans2[i];
        	}
    		System.out.print(sum);
    		
    	}else {
    		for(int i=0;i<n;i++) {
        		sum+=arr[i];
        	}
    		System.out.print(sum);
    	}
    	   
    }
    
    public static long[] findAndMultiplyMaxSumSubarray(long[] arr, double d) {
        int n = arr.length;
        long[] result = Arrays.copyOf(arr, n);

        long maxSum = Long.MIN_VALUE;
        long currentSum = 0;
        int start = 0;
        int end = 0;
        int maxStart = 0;
        int maxEnd = 0;

        for (int i = 0; i < n; i++) {
            currentSum += arr[i];

            if (currentSum > maxSum) {
                maxSum = currentSum;
                maxStart = start;
                maxEnd = i;
            }

            if (currentSum < 0) {
                currentSum = 0;
                start = i + 1;
            }
        }

        for (int i = maxStart; i <= maxEnd; i++) {
            result[i] *= d;
        }

        return result;
  

#27届##美团求职进展汇总#
全部评论
好难
2 回复 分享
发布于 08-19 21:33 黑龙江
27?
1 回复 分享
发布于 08-25 22:39 北京
最后一题是博弈论吧,两次操作并不独立
点赞 回复 分享
发布于 08-18 19:18 北京
这27届就离谱
点赞 回复 分享
发布于 09-18 16:55 湖北
大佬
点赞 回复 分享
发布于 09-19 21:05 辽宁

相关推荐

09-30 11:17
已编辑
门头沟学院 前端工程师
包含时间线,问题和我的思路个性化问题和部分细节可能会有省略,仅供参考8.31&nbsp;笔试选择应该是全a编程a一半9.10&nbsp;美团一面面试官是安卓开发,所以问的全是八股1.自我介绍2.小数精度问题思路:基础回答即可,要回答出IEEE754,64位版本和其他版本区别,二进制的最终表现(0011无限循环)3.作用域问题思路:先回答基础八股,再追加v8执行器原理,追加执行栈和执行上下文的原理,引出作用域提升现象,从v8到顶层代码解释这种现象,这道题可以讲五六个知识点4.CommonJS和ES6&nbsp;Module思路:直接从源码层面讲,cjs是社区实现,es6是官方实现,require讲文件代码引入+缓存判断+在函数内执行,讲五大区别,然后手写require伪代码,其中五个入参(this,module,exports,__filename__,__dirname__)的定义和指向要阐述清楚,还有循环引用问题5.原型和原型链思路:阐述原型图关系,然后顺带讲原型链继承,和其他继承(一共6种)关系和优缺点,主流现在用哪个6.一道异步问题,然后讲异步原理思路:从chrome源码讲事件队列(渡一教育那个版本),讲线程进程定义,异步定义,为什么js是单线程,浏览器有哪些队列,promise,asyncawait前世今生,generator前世今生,浏览器和node的事件循环区别7.事件机制和事件委托思路:基础八股无拓展8.项目性能优化思路思路:我的大招,讲过类似的教学视频,直接讲了10分钟,从网络,资源,缓存,代码,委托,js压缩,css摇树讲9.你提到的css摇树讲一下思路:我的陷阱,直接讲purgecss原理,上伪代码,手写selector正则,JIT原理,兜底策略10.https握手思路:讲经典RSA握手,和TLS1.2,TLS1.3,RSA和EDCHE算法,会话复用,1RTT和0RTT(PSK)11.如果你要跨端参与安卓开发,你觉得有哪些挑战回答:本身就是安卓开发出身,从高中开始接触,后面转web开发,您无需担心。12.手撕leetcode二叉树中序遍历,两种方案13.反问个人表现,部门base,下一场什么时候约9.12&nbsp;美团二面二面面试官非常喜欢深挖,但没挖动1.自我介绍2.国际化怎么做的思路:讲字典树,语言权重头从这个问题开始,一直深挖Q1如何细分到页面?如何细分到组件?A1多级字典树,字典树分片,按需加载Q2团队开发如何处理字典?A2开发人员编写,或者使用正则判断提取需要翻译的内容,上判断内容伪代码Q3如果开发人员无法国际化,如何实现?A3浏览器插件思路,简单讲一下如何写插件,如何实现,然后插件如何内嵌到项目中Q4如何做一个通用的国际化工具A4根据A3思路深挖,最后挖的我也没说明白,面试官也没懂,然后面试官到此结束,换个问题3.你的项目有后台数据统计Q1如何埋点,热点问题如何上报A1如实回答Q2如果项目是hash路由和history路由混用,如何区分A2修改每个监听器单独处理Q3锚点问题如何解决A3忘了,面试官给了个思路,但是不靠谱,没反驳,也没记住Q4如何做通用的埋点思路A4以路由为主线深挖最后面试官给了我个监听DOM和BOM的方案,方案可行,但不符合面试官提到的通用型,当场反问,最后面试官觉得他的描述不准确,按描述讲我的方案更合理。这道题之后,就不再深挖技术了4.讲下http回答:定义,各个版本区别,http3,TCP,多路复用,头部压缩等等一系列细节追问,直到我和面试官都不会5.定长和不定长的http数据怎么传输的思路:content-length,&nbsp;transform&nbsp;encoding,keep&nbsp;alive原理,面试官听完挺满意6.http帧结构,具体讲思路:那图背的滚瓜烂熟了,全讲了7.CSRF攻击,SYN泛洪思路:基础八股,尽量展开吧8.你提到的csrf&nbsp;token如何优化思路:类jwt编码,无状态处理,减少服务器存储面试官给最优解:body和header都放token(这道题确实面试官厉害,是自己的盲区)剩下的都是项目和实习相关9.手撕:一道01背包题,非leetcode原题,美团自己编的10.反问:个人表现,ssp还有hc吗(我觉得答的非常好才会问这个问题),多久出结果,最后请求加快流程推进9.20&nbsp;意向本来是说有加面,但最后不知道什么情况,直接发了意向,具体原因我也不清楚,希望别给我白菜 #面经#
non_hana:每个问题都能回答得如此细致,甚至到底层的实现,我觉得可以说是几乎吊打其他的八股回答了。请问一下是怎么深入学习的这些知识点呢?
点赞 评论 收藏
分享
15 15 评论
分享
牛客网
牛客企业服务