保融科技秋招
笔试 / 10.09
选择题猜牌有点耗费时间,不过只要做过就很简单了
1.猜牌
有人从一手纸牌中选定一张牌,他把这张牌的花色告诉X先生,而把点数告诉了Y先生。两位先生都知道这手纸牌是:
黑桃J、8、4、2;
红心A、Q、4;
方块A、5;
草花K、Q、5、4。
X先生和Y先生都很精通逻辑,很善于推理。他们之间有对话如下:Y先生:我不知道这张牌。X先生:我知道你不知道这张牌。Y先生:现在我知道这张牌了。X先生:现在我也知道了。
根据以上对话,你能推测出这是下面哪一张牌?( )
A.方块A
B.红心Q
C.黑桃4
D.方块5
------------------------------------------------------------------------------------------------------------
方块5
称该牌为答案牌
首先第一句,Y知道点数,如果是唯一出现的点数,如J,2,K都只出现了一次,那么Y先生就一定知道哪一张是答案牌了,但他不知道,故肯定不是这几种
第二句话,X知道Y不知道,那么说X确定答案牌不是J,2,K这种只出现一次的牌,这是为什么呢?因为X是知道花色的,这说明答案牌的花色里不存在J,2,K这几种点数,比如告诉X答案牌的花色为红心,红心的选项为A、Q、4,都不惟一,故X可以确定那个人告诉Y的点数不是J,2,K这种出现一次的,而是A、Q、4中的其中一个数字,而仅知道这几个数字是不可能推断出具体牌的,故可推断花色只能是红心和方块。
第三句话,Y先生:现在我知道这张牌了。由于假设XY绝对聪明,我们的分析X、Y也都知道,那么对于知道点数的Y,在确定花色只能是红心和方块之后,立刻得到了答案
红心A、Q、4;
方块A、5;
排除A,若告诉Y的点数是A,即使知道了花色,Y也不可能立刻判断,因为两种花色都有
还剩下:
红心Q、4;
方块5;
最后,X先生:现在我也知道了。X知道了Y知道了以后,立刻得到答案,惟一的可能是那个人告诉X花色是方片。若告诉X花色是红心,则X还是不可能得到答案的。
2.10运动员准备,都准备完成裁判发令
应该CyclicBarrier更合适
CyclicBarrier cyclicBarrier = new CyclicBarrier(10,() -> System.out.println("裁判:所有运动员准备完毕,开始...")); ExecutorService executor = Executors.newCachedThreadPool(); for (int i = 1; i <= 10; i++) { final int offset = i; executor.execute(() -> { try { TimeUnit.MILLISECONDS.sleep(new Random().nextInt(1000)); System.out.println("运动员【" + offset + "】准备完毕" + Thread.currentThread().getName()); cyclicBarrier.await(); System.out.println("运动员【" + offset + "】开跑。。。" + Thread.currentThread().getName()); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } }); }
final CountDownLatch runner = new CountDownLatch(10); final CountDownLatch referee = new CountDownLatch(1); ExecutorService executor = Executors.newCachedThreadPool(); for (int i = 1; i <= 10; i++) { final int offset = i; executor.execute(() -> { try { TimeUnit.MILLISECONDS.sleep(new Random().nextInt(1000)); System.out.println("运动员【" + offset + "】准备完毕" + Thread.currentThread().getName()); runner.countDown(); referee.await(); System.out.println("运动员【" + offset + "】开跑。。。" + Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } }); } runner.await(); referee.countDown(); System.out.println("裁判:所有运动员准备完毕,开始..."); executor.shutdown();
3.解决if-else太多问题 简答题
卫语句 策略模式 函数式接口
还要画类图,写代码,做到这已经没时间了,,,,,,,,,
保融科技 一面
6人 群面
1. 一个线程能否调用两次start()方法?
2.线程池中核心线程保活方式
保活: 线程池中当没有任务时,核心线程总数不变
- 队列必须是阻塞队列BlockingQueue
- 线程池在有一个while方法,会通过getTask获取任务
- 有就执行,执行完继续while
- 没有任务,线程进入阻塞状态
- 如果线程运行时抛出异常,会退出while 会有一个flag标志位,根据标志位以及核心线程数量进行判断,addWorker开启线程
发生异常的线程会被线程池移除掉
execute(Runnable command) -> addWorker(Runnable firstTask, boolean core) -> run() -> runWorker(Worker w)
对于execute来说,这个比较好理解,从源码中可以发现,线程池中的线程在执行runWorker的时候,如果任务中抛出异常,则线程会直接将异常抛出并且,在抛出异常后,为了避免异常任务的线程被污染,执行该任务的worker线程会被销毁,然后重新创建一个无任务非核心的worker线程。所以,即使线程池中的所有任务都失败了,只要核心线程数不为0,程序就将会一直被workQueue#poll阻塞,导致Jvm不会退出.
3.IO 模型
IO 多路复用模型
buffer