岗位: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