2023.12.28 10:00~12:00某公司笔试

本文详述了一次Java开发实习生的笔试经历,涵盖毒蘑菇问题的二进制解决策略,简单编程题目,如List去重、Map操作,彩票问题的概率计算,数据库SQL查询,以及MyBatis的一级缓存、二级缓存和#{}与${}的区别。还讨论了推理题和不规则数独算法题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

岗位:Java开发实习生

形式:飞书自己录制,写题并讲解

毒蘑菇问题

经典二进制问题

1011种蘑菇,其中一种是毒蘑菇,最少需要多少只小白鼠找出毒蘑菇?

为了检验出哪一种是毒蘑菇,可以进行如下操作:

1.将1000个瓶子编号为从1到1011

2.将编号转换为二进制数,每一位表示对应位置上是否需要喂蘑菇,例如,瓶子1的编号为0000000001,表示只对第1只小白鼠喂毒药;瓶子2的编号为0000000010,表示只对第2只小白鼠喂蘑菇;瓶子3的编号为0000000011,表示对第1只和第2只小白鼠喂蘑菇,以此类推

3.将10只小白鼠编号为从1到10,每只小白鼠对应到二进制编号上的某一位,例如,小白鼠1对应到二进制编号的第1位,小白鼠2对应到二进制编号的第2位,以此类推

4.将编号二进制表示中对应小白鼠的位数上为1的蘑菇中取出一些蘑菇,分别喂给对应的小白鼠

5.监测每只小白鼠是否死亡,若有小白鼠死亡,说明吃下的蘑菇中有毒蘑菇;否则,说明吃下的蘑菇中没有毒蘑菇

6.根据小白鼠死亡的情况推断出毒蘑菇的编号

具体来说,首先一共有1011种蘑菇,2的10次方是1024,大于1011, 1011种蘑菇可以使用10位二进制数表示

从第1种开始:
第1种:00 0000 0001
第2种:00 0000 0010
第3种:00 0000 0011
……
第1010种:11 1111 0010
第1011种:11 1111 0011
需要十只小白鼠,若按顺序编号,ABCDEFGHIJ分别代表从低位到高位每一个位,每只小白鼠对应一个二进制位,如果该位上的数字为1,则给小白鼠吃对应的蘑菇,若观察到死亡的小白鼠编号为ACFGJ,一共死去五只小白鼠,则对应的编号为10 0110 0101,则毒蘑菇为该编号的蘑菇,转为十进制为613号

简单编程

1.给定一个List<String>,编写一个方法删除所有重复的字符串,并保持原有顺序不变

使用LinkedHashSet删除ArrayList中的重复数据

LinkedHashSet在内部完成两件事:删除重复数据,保持添加到其中的数据的顺序

@Test
public void test1_1() {
    List<String> list = new ArrayList<>(Arrays.asList("apple", "banana", "apple", "orange", "banana", "grape", "grape"));
    LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>(list);
    ArrayList<String> res = new ArrayList<>(linkedHashSet);
    System.out.println(res);
}

使用HashSet记录元素是否在之前出现过

@Test
public void test1_2() {
    List<String> list = new ArrayList<>(Arrays.asList("apple", "banana", "apple", "orange", "banana", "grape", "grape"));
    List<String> res = new ArrayList<>();
    HashSet<String> hashSet = new HashSet<>();
    for (String str : list) {
        if (!hashSet.contains(str)) {
            hashSet.add(str);
            res.add(str);
        }
    }
    System.out.println(res);
}

使用Java8新特性stream进行List去重

从arraylist中删除重复项,可以使用Java8 stream api,使用steam的distinct()方法返回一个由不同数据组成的流,内部通过对象的equals()方法进行比较

收集所有区域数据转为List使用Collectors.toList()

在不使用Set的情况下从ArrayList中删除重复项

@Test
public void test1_3(){
    List<String> list = new ArrayList<>(Arrays.asList("apple", "banana", "apple", "orange", "banana", "grape", "grape"));
    List<String> res = list.stream().distinct().collect(Collectors.toList());
    System.out.println(res);
}

2.给定一个Map<String, Integer>,其中键是名字,值是年龄,编写一个方法找出年龄最大的三个人的名字

传统方法

@Test
public void test2_1() {
    Map<String, Integer> map = new HashM
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值