保融科技秋招

笔试 / 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.线程池中核心线程保活方式

保活: 线程池中当没有任务时,核心线程总数不变

  1. 队列必须是阻塞队列BlockingQueue
  2. 线程池在有一个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

4.线程 进程 协程 区别

全部评论
感谢分下,希望碰到原题
1 回复 分享
发布于 2022-10-15 21:54 山西
技术类还要群面么,这么恶心
点赞 回复 分享
发布于 2022-10-18 18:16 重庆
这个公司开的貌似也不高 搞那么恶心吗
点赞 回复 分享
发布于 2022-10-30 23:09 安徽

相关推荐

10-25 10:49
门头沟学院 Java
投票
东软集团(大连)有限公司 Java开发 10400*12 本科211
点赞 评论 收藏
分享
评论
6
50
分享
牛客网
牛客企业服务