笔试题

1、(唯品会笔试题)编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

public class ThreeThread {
    
    public static void main (String[] args) throws Exception {
        Object A = new Object ();
        Object B = new Object ();
        Object C = new Object ();
         
        Thread t1 = new Thread (new Print(A, B), "A");
         
        Thread t2 = new Thread (new Print(B, C), "B");
         
        Thread t3 = new Thread (new Print(C, A), "C");
         
        // 为了让线程依次启动 所以在Main函数所在的线程 添加了一个sleep(1)
        t1.start();
        Thread.sleep(1);    
        t2.start();
        Thread.sleep(1);
        t3.start();
         
    }
}
 
 
class Print implements Runnable {
     
    private Object self;
    private Object next;
     
    public Print (Object self, Object next) throws InterruptedException {
        this.self = self;
        this.next = next;
 
    }
     
    public void run () {
         
        for (int i = 0; i < 10; i++) {
            synchronized (self) {
                synchronized (next) {
                    System.out.print (Thread.currentThread().getName());
                    next.notify();
                }
                try {
                    if (i == 9) {
                        return;     // 当i == 9 即最后一次循环, 将直接退出 不再进行等待                   
                    } 
 
                    self.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
 
    }
}
MultiThread

2、(唯品会笔试题)简述TCP三次握手命令。(这里补充简述除了连接外的断开情况。)

A向B发出请求,主动打开连接,B被动打开连接。

1)A向B发出连接请求报文段,这时首部中的同部位SYN=1,同时选择一个初始序列号seq=x;

2)B收到哦连接请求报文段后,如同意建立连接,则向A发出确认,在报文段中把SYN和ACK都置为1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y;

3)A收到B的确认后,再向B发出确认。将报文段中的ACK置为1,确认号ack=y+1,而自己的序号为seq=x+1.

A向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。

1)A把释放报文段首部的终止控制位FIN置为1,序号seq=u;

2)B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,这时B进入关闭等待状态。A接收到B发的确认后,进入终止等待2状态;

3)若B已经没有要向A发出的数据,则B发出连接数据报文,将FIN置为1,ACK=1,B的序号为seq=w。确认号为ack=u+1;

4)A收到B的连接释放报文后,发出确认,置ACK为1,自己的序号为seq=u+1,确认号ack=u+1.

3、简述GoF设计模式

1)创建型模式

简单工厂模式(Simple Factory);

工厂方法模式(Factory Method);

抽象工厂模式(Abstract Factory);

创建者模式(Builder);

原型模式(Prototype);

单例模式(Singleton)。

 2)结构型模式

外观模式(Facade);

适配器模式(Adapter);

代理模式(Proxy);

装饰模式(Decorator);

桥模式(Bridge);

组合模式(Composite);

享元模式(Flyweight)。

3)行为型模式

模板方法模式(Template Method);

观察者模式(Observer);

状态模式(State);

策略模式(Strategy);

职责链模式(Chain of Responsibility);

命令模式(Command);

访问者模式(Visitor);

调停者模式(Mediator);

备忘录模式(Memento);

迭代器模式(Iterator);

解释器模式(Interpreter)。

4、在一冒险游戏里,你见到一个宝箱,身上有N把钥匙,其中一把可以打开宝箱,假如没有任何提示,随机尝试,问: 
(1)恰好第K次(1=<K<=N)打开宝箱的概率是多少。

    (1-1/n)*(1-1/(n-1))*(1-1/(n-2))***(1/(n-k+1)) = 1/n 

(2)平均需要尝试多少次。 
   这个就是求期望值   由于每次打开宝箱的概率都是1/n,则期望值为:   1*(1/n)+2*(1/n)+3*(1/n)+......+n*(1/n) = (n+1)/2 

原文地址:https://www.cnblogs.com/cailingsunny/p/4806869.html