Welcome everyone

美团基础架构面试

面试 汪明鑫 1276浏览 0评论

上午10点多跑来面的,把还记的住的一些问题记录一下。

 

一面:

 

  • 上来就来了个算法,在循环有序的数组中查找给定的key,如10 11 12 13 14 1 2 3 4 5 6 7 8 9
  • i++是原子性操作吗
  • volatile有什么作用
  • 线程的状态及状态转换
  • 线程sleep方法和wait方法有什么区别
  • 线程状态能直接从挂起到执行吗
  • 0.3 == 0.1 * 3 返回true还是false

 

 

  • 值传递和引用传递

  • sql优化

  • IO、Socket相关
  • TCP状态
  • TCP协议为什么可靠
  • 用过RPC吗
  • CAP理论
  • Zookeeper实现了CAP哪几个
  • Zookeeper集群中的角色
  • Zookeeper一致性
  • Kafka实现了CAP哪几个
  • Kafka的基本原理
  • Kafka的broker是什么
  • Kafka的partition是什么
  • Kafka为什么可靠
  • 前端会哪些
  • 有没有可以展示的作品
  • 然后面试给我看了下他们的系统的几个页面,问我做的好不好
  • 有什么想问的

 

二面:

 

  • 自我介绍
  • 看过哪些分布式的书籍
  • 实习中遇到过哪些挑战
  • CAP理论
  • Zookeeper实现了CAP哪几个
  • Zookeeper leader选举
  • Zookeeper什么情况下选不出leader
  • Zookeeper怎么保证一致性
  • Zookeeper是整体一致还是局部一致

 

  • 给一个场景:有一个很大的数组装了所有的员工,需要抽奖(一个一等奖,一个二等奖,一个三等奖),中奖人不能重复,random( )函数只能调用三次。

这个问题看起来很简单,其实有几个坑,我当时说了几次,再面试官提醒下才说出正确答案

注意题设条件:

1)一个很大的数组

2)中奖人不能重复

3)random( )函数只能调用三次

 

//一个长度为n的数组,假设n很大
//random()函数,每次在数组大小的范围内产生一个随机下标,表示一个人中奖
//还要保证一个人不能被重复中奖

 

我的第一版答案 (伪代码)

int count = 0;
        List<Integer> list = new ArrayList<>();  //存放中奖者下标
        while(true){

            调用random( )在数组长度范围内随机产生一个下标index

            if(index 不在list里面){
                则放入list里面;
                count++;
            }

            if(count == 3){
                break;
            }
        }

问题:如果命中同一个index,则又要重新调用random( ),所以不符合题意

 

我的第二版答案:

第一次调用random( ),产生三等奖的下标index,第二次调用random( )在[0,index-1]的范围产生二等奖下标

第三次调用random( )在[index+1,n)产生一等奖下标

 

这样的做法有2个问题:

1,如果第一个index,落在数组的0下标或者数组的最后一个下标怎么办?

2,如果第一个index落在的下标等于1 ,那二等奖是不是一定就是0下标,而三等奖在[2,n)产生下标,失去了公平性,所以不行

 

我的第三版答案:

把这个数组平均切成三份,在每一份产生一个下标作为中奖者。

那问题又来了,那一个数组分成3个部分,哪个部分获得一等奖?哪个部分获得二等奖?

如果指定了哪个部分获得几等奖,则失去了公平性,如果不指定,随机分配哪个部分获得几等奖,则又掉了3次以上得random( )函数

 

所以我想的几个都是馊主意,不是违背题意,就是违背公平性。

 

我的第四版答案:

我就寻思着,既然只能用三次random( ),那我就不让他重复命中一个下标(即调用一次random( )必然产生一个中奖者),就把命中的下标得元素移除 (早都该这样想了)

然后我就说把本次中奖者直接移除,不参与下次抽奖。

面试官说,这是大数组,移除元素时间复杂度高,不行。

当时是有点蒙蔽的。

 

面试官提示我,一个数组怎么移除一个元素最快

当时突然想到,在数组其他位置删除元素是O(n) ,在末尾删除是O(1)

 

我的第五版答案:

每次产生的下标的元素和末尾元素交换位置,再删除末尾元素就行了。。。

 

可能我的脑子是锈透了,这种题还想了半天,脑子里浮现的都是馊主意。。。应该抓住本题数组怎么删除元素快的本质就可以解决

 

  • TCP状态

这个是真的重要,面试已经遇到很多次了

 

  • 什么时候发生内存泄漏

我说了个oom,面试官说GC频率高有2个原因,一个是oom,一个是内存泄漏,什么时候发生内存泄漏,当时突然想到io没close、数据库连接没close

 

  • maven相关

说了下super pom,约定大于配置,依赖,maven镜像,maven私服,maven中央仓库,传统的导入jar包的不方便性

 

  • 如果你的项目是依赖junit的一个版本,你依赖的一个业务项目,他又依赖junit的另一个版本,这时候会加载junit的哪个版本

我说了最短路径原则和先加载原则

 

  • git命令
  • push的时候有没有遇到过untracked
  • 用过Spring Boot吗
  • sql优化

  • 有没有在linux上部署项目
  • 前端怎么样
  • 有什么想问的

 

转载请注明:汪明鑫的个人博客 » 美团基础架构面试

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz