1.首先说了一下自我介绍,说了一下姓名,学校,以及目前在实验室所做的项目。(可能实验室项目比较水,所以就没有追问)。
2.面试官问我,是面试java后台开发的,有关的设计模式,知道哪些?
我就说了一下在复习的过程中,比如NIO中所用的策略者模式,观察者模式,单例模式。(没说对,应该是NIO的实现主要采用了Reactor反应器模式,这里设计模式与观察者模式类似)
然后面试官问了一下,如果让你写代码实现这些设计模式,你能否实现,比如说单例模式?
我回答的是,因为只是了解了一下,代码实现并没有仔细去看,单例模式也只是看过一眼,我试一下写写。
当时写的代码是:
class Single{ int a; Single(int a){ this.a = a; } public Single getN(){ Single s = new Single(a); return s; } public static void main(String[] arg){ Single s = Single.getN(); } }
并没有写对。
对单例的实现可以分为两大类——懒汉式和饿汉式,他们的区别在于:
-
懒汉式:指全局的单例实例在第一次被使用时构建。
-
饿汉式:指全局的单例实例在类装载时构建。
正确的如下:
// 懒汉式单例 public class Single1 { private static Single1 instance; public static Single1 getInstance() { if (instance == null) { instance = new Single1(); } return instance; } } //饿汉式实现 public class SingleB { private static final SingleB INSTANCE = new SingleB(); private SingleB() {} public static SingleB getInstance() { return INSTANCE; } }
然后这道题我也就凉了。
后续要写写关于设计模式的博客。
随手百度的可以参考:https://www.cnblogs.com/dongyu666/p/6971783.html
3.接着又问了我一个题,一开始我并没有听清楚,后来我又自己叙述了一下,面试官又纠正了我一下。算法题:n+1个数,数值范围在1-n之间,问如何查询到重复的那个数。(我自己太实在,冒了两句,这个题我遇见过,这个题我做过,估计即使我叙述出来了,也没有加分啦)
我的思路是:n/2,分出1~n/2和n/2+1~n,遍历小于n/2的数值的个数有多少,如果大于n/2则说明有重复的再这里面,然后在将1~n/2之间再分,再分别遍历统计个数,直到遍历到一个数值得个数等于2,说明找到重复的数了。
接着问了一下我出了Java,有没有接触过go语言,我说没有,接触过Python,Scala,js,看过这类的代码,代码的执行流程还是可以看懂的。
4.然后不知道是不是我自己说之前的题做过(自己给自己挖坑),所以面试官给我了一张带有如下题的纸,问我有没有思路:
在一段高速公路上,30分钟之内见到汽车经过的概率是0.95,那么,在10分钟内见到汽车经过的概率是多少?
当时就懵了,看了半天,就是没有思路,概率之类的题并不太会(这不是脑筋急转弯)。正确答案如下:
假设10分钟内见到汽车经过的概率是x。 30分钟内即3段10分钟(独立事件)见到汽车经过的概率是 1-(1-x)^3 (1-x)(1-x)(1-x)=1-0.95 即 1-(1-x)^3 = 0.95 解得x约为0.63。
5.然后又给我一道题:
从前,在海上有5个海盗,一次他们抢到100颗价值连城的钻石,但如何分配这些钻石成了
问题,5个人都很贪婪,且又都极为聪明,于是他们想一出个办法,通过抓阄的方式确定一
个从1到5的先后顺序,然后由第1个人提出一个分配方案,如果这个方案获得半数以上的支
持,那么就按这个海盗的方案执行,倘只是达到半数或低于半数,那么这个海盗将被扔到海
里,接着再由第2个人提出新的分配方案,同第1个人一样,不能达到半数以上,这个海盗也
会被扔到海里喂鱼,如此下去,直到有一个人的方案能够最终获得半数以上的支持。现在问
题出来了,如果你是第1个强盗,你提出一个什么样的分配方案,在保住小命的前提下还能
获得大多的钻石?
这真是要了我的命,智商底下,一下子就不知道了(这其实是 一个博弈论的题,后来小伙伴们说在秦时明月和端脑的动漫中都出现过!!!我一定回去好好补习一下这两部漫画!!!!)只能灰头灰脸的说没思路,不知道要考我什么!!!丢人
请看下面分析:
如果你是第5个强盗,你当然希望将前4个扔进海里,通吃所有的钻石。
如果你是第4个强盗,那也只能是给第5个强盗100颗钻石,然后还要看他高兴不高兴,他如
果依旧不同意,那么,按照游戏规则,没有达半数以上的人支持,自己还是要被扔到海里。
如果你是第3个强盗,你会留下100颗钻石,第4个强盗只能同意你的方案才能很有把握的
留下小命,不然到他拿方案时,他反而吃不准第5个强盗想不想留下他这条小命。
如果你是第2个人,必须争取到两个人才能获得半数以上的支持,但第3个人你是不可能争取
来的,所以只能在第4个和第5个人身上打主意,按第3个的分配方案,他们将一无所获,所
以只要给他们两个每人1颗钻石,他们就能支持第2个人。 第1个也必须争取到两个人支持,
但不可能获得第2个人的支持,按照第2个人的分配方案,第3个人将一无所获,所以给他1
颗钻石,他就会支持自己,而第4个和第5个,在第2个人的分配方案中,只能获得1颗,那
么只要给他们其中的任何一个人2颗钻石,就会获得支持,结果是,第1个人可以获得97颗
钻石。
上面的分析就一定对???
这样的问题其实是个博弈论的问题,谁都想自己的利益最大化,博弈的结果是不会按任何人的意愿分配而是大家均分,压根没有一家独大的可能,当然如果博弈各方条件不同,分配的比例也会不同,而这个题目里面的no.1条件是最不好的(最先死最先亮牌没有变牌的可能),所以要是分的话,他是最少的。
首先,题意说明否决制度是:达到一半的人反对,提议就会被否决; 第二,作为赌注的,不光是提议者的钻石收益,还包括他们的生命; 第三,每个海盗都应该是足够聪明的,他不光知道区分不同方案对自己利益的影响,还会预 见其他海盗对不同方案的态度,从而修正自己对某些方案的态度,以使利益最大化。 试作倒排分析如下: 4提议时:1、2、3已经被丢到海里了,这时5只要投反对票就可以让4去喂鱼,根本不用管 他怎么分。就算4把钻石全给5,他也没把握保住自己的小命。这时,他的利益底线是保证 自己生命的绝对安全。 3提议时:1、2已经下海了。3很清楚如果自己的提议被否决后4、5之间的关系,所以,他 不给4一颗钻石,4也会无条件同意他的提议。如此,两票通过。不管5是什么意见。分配 方案:3得100颗,4、5没有。这时3的利益底线是100颗钻石,4、5都是0颗。 2提议时:1已经不在了。这时他必须得到两人以上同意,才能活命并得利。如果把钻石全 给3,对3、4、5来说,也不过和3提议时一样,没有更大的利益,他们可以同意,也可 以否决2的提议,所以3的利益底线2无法满足。他的分配方案是:3不给,4、5各一颗, 自己拿98颗。这时2的利益底线是98,3为0,4、5是一颗。 1提议时:大家都在,不会影响战斗力:)。他必须争取4人中的2人同意。方案:自己97颗,2不给,3给一颗,
4或5二人中任选一人给2颗。 对不对?俺再想想~~~~ ------------------------------------------------- 5会反对任何方案,以独吞钻石。 4会赞成任何方案,否则无法保证自己性命。 3知道4的想法,会产生自己独占钻石的想法,不能满足的方案都会反对。 2需要把钻石全给3才能过关。 因此,1这样分: 自己98,2号1,4号1。 这样,1,2,4赞成,3,5反对,多数票通过。
以上是网上搜刮来的答案。
我只想说是我读书多,读傻了还是读书少,被坑了。但是!一定要发散思维,无论如何,都要说几句,不能什么也不说,这样在面试中会被刷掉好多分。
6.后来又问了我开源组件知道XXXX,我当然没听清楚,面试官就以为我不知道,后面接着问了我网络编程方面了解什么,我就说只用c做过socket,使用过select,后来他问我epoll,由于网络编程了解甚少,估计是深圳总部的项目组里需要这方面的,就只能无缘啦。(xxxx框架应该是指netty框架)
下去我一定好好补补这方面的知识!
补充一下网络编程学习路径:
总结:知识面太窄,只局限于集合类,多线程,SSM或SSH的相关知识上,关于网络编程方面知道的太少,甚至还有其他多个方面。然后就是设计模式只知道名字,不知道代码实现,需要补补。再就是数学基础不太好,概率等方面的知识。还有开放性(博弈论)的题目,需要多看看,扩展一下自己的思维。
总之,还需努力。加油!