• 某讯实习生后台开发一面总结


    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.951-(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、、5来说,也不过和3提议时一样,没有更大的利益,他们可以同意,也可
    以否决2的提议,所以3的利益底线2无法满足。他的分配方案是:3不给,、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框架)

     下去我一定好好补补这方面的知识!

    补充一下网络编程学习路径:

    在学习socket api阶段,如果好奇心强烈,推荐看下unix网络编程,了解下更低层的知识,这块是逃不过的,会用了api才是开始。
    下步就是学习reactor、proactor模式,当然理解就好,没必要自己去写,这时就知道为什么要用netty等框架。
    等框架用的顺手了,慢慢就理解到网络编程重点不在于socket api,而是线程模型,所以就开始深入研究多线程编程。
    再之后就是分布式。还有一个RPC框架也需要具体了解一下。

    总结:知识面太窄,只局限于集合类,多线程,SSM或SSH的相关知识上,关于网络编程方面知道的太少,甚至还有其他多个方面。然后就是设计模式只知道名字,不知道代码实现,需要补补。再就是数学基础不太好,概率等方面的知识。还有开放性(博弈论)的题目,需要多看看,扩展一下自己的思维。

    总之,还需努力。加油!

  • 相关阅读:
    记录ci框架中定时任务的执行
    2019 年MySQL面试题及答案
    Net线程问题解答(转)
    vs2005 Team System的版本
    ASP.NET 安全认证(如何运用 Form 表单认证)
    .net调用存储过程时的输出函数
    在服务器执行js脚本
    简单的批量更新(小技巧)
    UNION 和UNION ALL 的区别
    ServerVariable(环境变量)
  • 原文地址:https://www.cnblogs.com/weiziqiang/p/8920376.html
Copyright © 2020-2023  润新知