字节跳动后端面试题之延禧攻略
题目描述:
皇宫之中,乾隆皇帝嫔妃众多,分为多派,经常互相争宠,乾隆皇帝正为此发愁, 他请魏璎珞替他想想办法,希望后宫之中尽可能少的分派。
魏璎珞把后宫中的众多嫔妃叫来,每位嫔妃将自己要好的姐妹名字写在一张字条上。 只要名单中有对方名字,就表示想与对方交好,则分在一派。
例如高贵妃名单中有纯妃,纯妃名单中有富察皇后,则她们三人都会归为一派, 如娴妃名单中没有任何人,其他嫔妃的名单中也没有娴妃,则娴妃自己为一派。
魏璎珞给每位嫔妃编上号,从1开始,共有n位嫔妃,每个人的名单写上想要交好的嫔妃编号,名单后面以0结尾。
互相交好或者间接交好的嫔妃分为一派,最后魏璎珞将分成的派别数上报给皇帝,皇帝十分满意。 皇上询问魏璎珞是如何划分的,魏璎珞将统计的字条给皇上看,字条如下:
10 //有10位嫔妃 0 //1号娴妃不想与任何人交好 5 3 0 //2号则希望能与5号3号姐妹一起 2,5,3 8 4 0 3,8,4 9 0 9 0 3 0 0 //七号不予别人交好,但是别人与他交好也算 7 9 0 0 9 7 0
最后输出派数为 2,除了1号自己为一派,其他人都分为另外一派
思路: 1.创建集合 ;(创建一个集合用于存储,每个嫔妃的交好名单 )(每个嫔妃的交好名单用Set 自动去重)
2.判断两个嫔妃的交好名单是否有交集 ;如果有交集先合并两个交好名单到一个交好名单然后再删除另一个,如无交集 继续向下比较
public class MyWomen {
public static void main(String[] args) {
List list = new LinkedList();//存放 每一位嫔妃交好名单的集合
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//嫔妃的数量
for (int i = 1; i <= n; i++) { //从1号嫔妃开始,把每个人的交好名单存入set ,然后添加进list
Set set = new HashSet();
set.add(i); //注意把自己也要添加进集合
while (true) {
int value = sc.nextInt();
if (value != 0) { //等于0说明结束了(题中已说明)
set.add(value);
} else {
break;
}
}
list.add(set);
}
//循环结束 list中 { {一号嫔妃的交好名单},{二号嫔妃的交好名单},.....}
//接下来就要根据断list中的嫔妃的交好名单,看是否有交集然后进行相应的处理
for (int i = 0; i < list.size(); i++) { //类似于冒泡排序
Set set1 = (Set)list.get(i);
Set resultSet = new HashSet(); //用这个set,来判断set1和set2是否有交集
for(int j = 0; j < list.size(); j++) {
Set set2 = (Set)list.get(j);
resultSet.clear();
resultSet.addAll(set1);
resultSet.retainAll(set2); //resultSet已经等于set1 ,将set1中不包含set2的部分去除,使得resultSet里为set1和set2的交集元素
if (set1 != set2 && resultSet.size() >= 0) {//resultSet.size() >= 0说明set1与set2不为空
set1.addAll(set2); //将set2融进set1中(HashSet自动去重)
list.remove(j); //set2已经与set1融合,删除set2
} else {
j++;
}
} //list中的size即是分组的个数
}
System.out.println(list);
}
}